aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Erik de Castro Lopo <erikd@mega-nerd.com>2016-09-06 19:34:40 +1000
committerGravatar Erik de Castro Lopo <erikd@mega-nerd.com>2016-09-07 07:52:41 +1000
commit2951cd01a725c52afc6bf6a83c068cfb40504fdf (patch)
treec8dc3a346602e7f10272eabb22befa90e278aa8d
parentcd6eae1dc5706efafcb73e9f16ac22cd0cc9fe1d (diff)
Don't use readdir_r if deprecated
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
-rw-r--r--cbits/HsUnix.c19
-rw-r--r--changelog.md4
2 files changed, 22 insertions, 1 deletions
diff --git a/cbits/HsUnix.c b/cbits/HsUnix.c
index bdd1e80..08cccd5 100644
--- a/cbits/HsUnix.c
+++ b/cbits/HsUnix.c
@@ -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;
diff --git a/changelog.md b/changelog.md
index eb429cb..4bbeeb3 100644
--- a/changelog.md
+++ b/changelog.md
@@ -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