[Pkg-gnupg-commit] [gpgme] 54/132: core: Fix possible deadlock due to get_max_fds.
Daniel Kahn Gillmor
dkg at fifthhorseman.net
Wed Apr 26 01:01:22 UTC 2017
This is an automated email from the git hooks/post-receive script.
dkg pushed a commit to branch experimental
in repository gpgme.
commit 93a59070c699d569d1eac7ba22355fe3f5d10882
Author: Werner Koch <wk at gnupg.org>
Date: Fri Feb 3 13:13:22 2017 +0100
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 <wk at gnupg.org>
---
src/posix-io.c | 68 ++++++++++++++++++++++++++++++++--------------------------
1 file changed, 37 insertions(+), 31 deletions(-)
diff --git a/src/posix-io.c b/src/posix-io.c
index 5296f5f..cabb3e5 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)
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-gnupg/gpgme.git
More information about the Pkg-gnupg-commit
mailing list