On OS/2 kLIBC, d_name is not the last field of struct dirent. So copying struct dirent according to the size calculated based on d_name blows the fields after d_name up.
The correct way is to allocate the whole size of struct dirent. * lib/scandir.c (_D_ALLOC_NAMLEN): Consider the fields after d_name on OS/2 kLIBC. --- lib/scandir.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/scandir.c b/lib/scandir.c index 9da342d..a41ef1a 100644 --- a/lib/scandir.c +++ b/lib/scandir.c @@ -36,7 +36,15 @@ # define _D_EXACT_NAMLEN(d) strlen ((d)->d_name) #endif #ifndef _D_ALLOC_NAMLEN -# define _D_ALLOC_NAMLEN(d) (_D_EXACT_NAMLEN (d) + 1) +# ifndef __KLIBC__ +# define _D_ALLOC_NAMLEN(d) (_D_EXACT_NAMLEN (d) + 1) +# else +/* On OS/2 kLIBC, d_name is not the last field of struct dirent. See + <http://trac.netlabs.org/libc/browser/branches/libc-0.6/src/emx/include/sys/dirent.h#L68>. */ +# include <stddef.h> +# define _D_ALLOC_NAMLEN(d) (sizeof (struct dirent) - \ + offsetof (struct dirent, d_name)) +# endif #endif #if _LIBC -- 2.9.2