>From e1139059e5c5e05c955adb2d6fec357235b158b2 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Wed, 27 May 2020 20:11:27 +0200 Subject: [PATCH 16/18] vma-iter: Make more robust in multithreaded applications. * lib/vma-iter.c (rof_open, vma_iterate): Pass an O_CLOEXEC flag to open(). * modules/vma-iter (Depends-on): Add 'open'. --- ChangeLog | 7 +++++++ lib/vma-iter.c | 16 ++++++++-------- modules/vma-iter | 1 + 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8922897..4946b1d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2020-05-27 Bruno Haible + vma-iter: Make more robust in multithreaded applications. + * lib/vma-iter.c (rof_open, vma_iterate): Pass an O_CLOEXEC flag to + open(). + * modules/vma-iter (Depends-on): Add 'open'. + +2020-05-27 Bruno Haible + truncate: Make more robust in multithreaded applications. * lib/truncate.c (truncate): Pass an O_CLOEXEC flag to open(). diff --git a/lib/vma-iter.c b/lib/vma-iter.c index a1f67f0..10ccda4 100644 --- a/lib/vma-iter.c +++ b/lib/vma-iter.c @@ -174,7 +174,7 @@ rof_open (struct rofile *rof, const char *filename) unsigned long pagesize; size_t size; - fd = open (filename, O_RDONLY); + fd = open (filename, O_RDONLY | O_CLOEXEC); if (fd < 0) return -1; rof->position = 0; @@ -267,7 +267,7 @@ rof_open (struct rofile *rof, const char *filename) if (lseek (fd, 0, SEEK_SET) < 0) { close (fd); - fd = open (filename, O_RDONLY); + fd = open (filename, O_RDONLY | O_CLOEXEC); if (fd < 0) goto fail2; } @@ -924,7 +924,7 @@ vma_iterate (vma_iterate_callback_fn callback, void *data) fname -= 6; memcpy (fname, "/proc/", 6); - fd = open (fname, O_RDONLY); + fd = open (fname, O_RDONLY | O_CLOEXEC); if (fd < 0) return -1; @@ -939,7 +939,7 @@ vma_iterate (vma_iterate_callback_fn callback, void *data) So use mmap(), and ignore the resulting VMA. */ memneed = ((memneed - 1) / pagesize + 1) * pagesize; # if !HAVE_MAP_ANONYMOUS - zero_fd = open ("/dev/zero", O_RDONLY, 0644); + zero_fd = open ("/dev/zero", O_RDONLY | O_CLOEXEC, 0644); if (zero_fd < 0) goto fail2; # endif @@ -1049,7 +1049,7 @@ vma_iterate (vma_iterate_callback_fn callback, void *data) fname -= 6; memcpy (fname, "/proc/", 6); - fd = open (fname, O_RDONLY); + fd = open (fname, O_RDONLY | O_CLOEXEC); if (fd < 0) return -1; @@ -1064,7 +1064,7 @@ vma_iterate (vma_iterate_callback_fn callback, void *data) So use mmap(), and ignore the resulting VMA. */ memneed = ((memneed - 1) / pagesize + 1) * pagesize; # if !HAVE_MAP_ANONYMOUS - zero_fd = open ("/dev/zero", O_RDONLY, 0644); + zero_fd = open ("/dev/zero", O_RDONLY | O_CLOEXEC, 0644); if (zero_fd < 0) goto fail2; # endif @@ -1168,7 +1168,7 @@ vma_iterate (vma_iterate_callback_fn callback, void *data) fname -= 6; memcpy (fname, "/proc/", 6); - fd = open (fname, O_RDONLY); + fd = open (fname, O_RDONLY | O_CLOEXEC); if (fd < 0) return -1; @@ -1187,7 +1187,7 @@ vma_iterate (vma_iterate_callback_fn callback, void *data) So use mmap(), and ignore the resulting VMA. */ memneed = ((memneed - 1) / pagesize + 1) * pagesize; # if !HAVE_MAP_ANONYMOUS - zero_fd = open ("/dev/zero", O_RDONLY, 0644); + zero_fd = open ("/dev/zero", O_RDONLY | O_CLOEXEC, 0644); if (zero_fd < 0) goto fail2; # endif diff --git a/modules/vma-iter b/modules/vma-iter index 08f3c0f..4c8ce8c 100644 --- a/modules/vma-iter +++ b/modules/vma-iter @@ -11,6 +11,7 @@ stdint unistd extensions getpagesize +open configure.ac: gl_FUNC_MMAP_ANON -- 2.7.4