Mercurial > gnulib
changeset 38219:620120a09469
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.
author | KO Myung-Hun <komh78@gmail.com> |
---|---|
date | Thu, 01 Dec 2016 19:52:46 +0900 |
parents | 5bc20d24ba69 |
children | 728601080a3f |
files | ChangeLog lib/scandir.c |
diffstat | 2 files changed, 15 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Thu Dec 01 19:52:45 2016 +0900 +++ b/ChangeLog Thu Dec 01 19:52:46 2016 +0900 @@ -1,3 +1,9 @@ +2016-12-01 KO Myung-Hun <komh78@gmail.com> + + 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 <komh78@gmail.com> alphasort, scandir: Port to OS/2 kLIBC
--- a/lib/scandir.c Thu Dec 01 19:52:45 2016 +0900 +++ b/lib/scandir.c Thu Dec 01 19:52:46 2016 +0900 @@ -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