Don't use readdir_r if deprecated
authorErik de Castro Lopo <erikd@mega-nerd.com>
Tue, 6 Sep 2016 09:34:40 +0000 (19:34 +1000)
committerErik de Castro Lopo <erikd@mega-nerd.com>
Tue, 6 Sep 2016 21:52:41 +0000 (07:52 +1000)
GNU glibc 2.23 and later deprecate `readdir_r` in favour of plain old
`readdir` which in some upcoming POSIX standard is going to required to be
re-entrant.

Eventually we want to drop `readder_r` all together, but want to be
compatible with older unixen which may not have a re-entrant `readdir`.

Solution is to make systems with *known* re-entrant `readir` use that and
use `readdir_r` whereever we have it and don't *know* that `readdir` is
re-entrant.

Closes: https://github.com/haskell/unix/issues/70

cbits/HsUnix.c
changelog.md

index bdd1e80..08cccd5 100644 (file)
@@ -37,12 +37,29 @@ int __hsunix_push_module(int fd, const char *module)
 }
 
 /*
+ * GNU glibc 2.23 and later deprecate `readdir_r` in favour of plain old
+ * `readdir` which in some upcoming POSIX standard is going to required to be
+ * re-entrant.
+ * Eventually we want to drop `readder_r` all together, but want to be
+ * compatible with older unixen which may not have a re-entrant `readdir`.
+ * Solution is to make systems with *known* re-entrant `readir` use that and use
+ * `readdir_r` whereever we have it and don't *know* that `readdir` is
+ * re-entrant.
+ */
+
+#if defined (__GLIBC__) && (__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 23)
+#define USE_READDIR_R 0
+#else
+#define USE_READDIR_R 1
+#endif
+
+/*
  * read an entry from the directory stream; opt for the
  * re-entrant friendly way of doing this, if available.
  */
 int __hscore_readdir( DIR *dirPtr, struct dirent **pDirEnt )
 {
-#if HAVE_READDIR_R
+#if HAVE_READDIR_R && USE_READDIR_R
   struct dirent* p;
   int res;
   static unsigned int nm_max = (unsigned int)-1;
index eb429cb..4bbeeb3 100644 (file)
@@ -1,5 +1,9 @@
 # Changelog for [`unix` package](http://hackage.haskell.org/package/unix)
 
+## 2.7.2.1  *Sep 2016*
+
+  * Don't use `readdir_r` if its deprecated.
+
 ## 2.7.2.0  *Apr 2016*
 
   * Bundled with GHC 8.0.1