aboutsummaryrefslogtreecommitdiffstats
path: root/src/posix-io.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2017-02-03 12:13:22 +0000
committerWerner Koch <[email protected]>2017-02-03 12:13:22 +0000
commit93a59070c699d569d1eac7ba22355fe3f5d10882 (patch)
tree95f8d190e06452cea3a76d569746edabae44841b /src/posix-io.c
parentcore: Minor cleanup of commit 195c735 (diff)
downloadgpgme-93a59070c699d569d1eac7ba22355fe3f5d10882.tar.gz
gpgme-93a59070c699d569d1eac7ba22355fe3f5d10882.zip
core: Fix possible deadlock due to get_max_fds.
* src/posix-io.c (get_max_fds): Do not use the Linux optimization. -- Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'src/posix-io.c')
-rw-r--r--src/posix-io.c68
1 files changed, 37 insertions, 31 deletions
diff --git a/src/posix-io.c b/src/posix-io.c
index 5296f5fc..cabb3e50 100644
--- a/src/posix-io.c
+++ b/src/posix-io.c
@@ -287,37 +287,43 @@ get_max_fds (void)
int rc;
/* Under Linux we can figure out the highest used file descriptor by
- * reading /proc/self/fd. This is in the common cases much fast than
- * for example doing 4096 close calls where almost all of them will
- * fail. */
-#ifdef __linux__
- {
- DIR *dir = NULL;
- struct dirent *dir_entry;
- const char *s;
- int x;
-
- dir = opendir ("/proc/self/fd");
- if (dir)
- {
- while ((dir_entry = readdir (dir)))
- {
- s = dir_entry->d_name;
- if ( *s < '0' || *s > '9')
- continue;
- x = atoi (s);
- if (x > fds)
- fds = x;
- }
- closedir (dir);
- }
- if (fds != -1)
- {
- fds++;
- source = "/proc";
- }
- }
-#endif /* __linux__ */
+ * reading /proc/self/fd. This is in the common cases much faster
+ * than for example doing 4096 close calls where almost all of them
+ * will fail.
+ *
+ * Unfortunately we can't call opendir between fork and exec in a
+ * multi-threaded process because opendir uses malloc and thus a
+ * mutex which may deadlock with a malloc in another thread. Thus
+ * the code is not used until we can have a opendir variant which
+ * does not use malloc. */
+/* #ifdef __linux__ */
+/* { */
+/* DIR *dir = NULL; */
+/* struct dirent *dir_entry; */
+/* const char *s; */
+/* int x; */
+
+/* dir = opendir ("/proc/self/fd"); */
+/* if (dir) */
+/* { */
+/* while ((dir_entry = readdir (dir))) */
+/* { */
+/* s = dir_entry->d_name; */
+/* if ( *s < '0' || *s > '9') */
+/* continue; */
+/* x = atoi (s); */
+/* if (x > fds) */
+/* fds = x; */
+/* } */
+/* closedir (dir); */
+/* } */
+/* if (fds != -1) */
+/* { */
+/* fds++; */
+/* source = "/proc"; */
+/* } */
+/* } */
+/* #endif /\* __linux__ *\/ */
#ifdef RLIMIT_NOFILE
if (fds == -1)