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