From 2c5bbee2ce4a85a27deab6e68102557d831c6d0f Mon Sep 17 00:00:00 2001 From: KO Myung-Hun Date: Thu, 1 Dec 2016 19:52:46 +0900 Subject: [PATCH] scandir: Fix _D_ALLOC_NAMLEN() on OS/2 kLIBC 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. --- ChangeLog | 6 ++++++ lib/scandir.c | 10 +++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 432be6f139..451d3a3821 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2016-12-01 KO Myung-Hun + + scandir: Fix _D_ALLOC_NAMLEN() on OS/2 kLIBC + * lib/scandir.c (_D_ALLOC_NAMLEN): Consider the fields after d_name on + OS/2 kLIBC. + 2016-12-01 KO Myung-Hun alphasort, scandir: Port to OS/2 kLIBC diff --git a/lib/scandir.c b/lib/scandir.c index 9da342d8ba..a41ef1ad3e 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 + . */ +# include +# define _D_ALLOC_NAMLEN(d) (sizeof (struct dirent) - \ + offsetof (struct dirent, d_name)) +# endif #endif #if _LIBC -- 2.39.5