summaryrefslogtreecommitdiffstats
path: root/lib/libc/iconv/citrus_mmap.c
diff options
context:
space:
mode:
authorjilles <jilles@FreeBSD.org>2012-12-17 10:38:51 +0000
committerjilles <jilles@FreeBSD.org>2012-12-17 10:38:51 +0000
commit3268de3a0df48cce2d34cda24995077176c1e0be (patch)
treeb1c948dd83e286f99bbcbd51cb1a0fa52990bd00 /lib/libc/iconv/citrus_mmap.c
parent00bb67e800bff8cd8ca4a28132de0063fc074f9c (diff)
downloadFreeBSD-src-3268de3a0df48cce2d34cda24995077176c1e0be.zip
FreeBSD-src-3268de3a0df48cce2d34cda24995077176c1e0be.tar.gz
libc/iconv: Fix race condition with setting FD_CLOEXEC.
A fork/exec could happen between open and fcntl, leaking a file descriptor. Using O_CLOEXEC fixes this and as a side effect simplifies the code. NetBSD already had this (I checked this after making the change myself). Reviewed by: gabor
Diffstat (limited to 'lib/libc/iconv/citrus_mmap.c')
-rw-r--r--lib/libc/iconv/citrus_mmap.c6
1 files changed, 1 insertions, 5 deletions
diff --git a/lib/libc/iconv/citrus_mmap.c b/lib/libc/iconv/citrus_mmap.c
index dd5d059..2aaf73c 100644
--- a/lib/libc/iconv/citrus_mmap.c
+++ b/lib/libc/iconv/citrus_mmap.c
@@ -57,12 +57,8 @@ _citrus_map_file(struct _citrus_region * __restrict r,
_region_init(r, NULL, 0);
- if ((fd = open(path, O_RDONLY)) == -1)
+ if ((fd = open(path, O_RDONLY | O_CLOEXEC)) == -1)
return (errno);
- if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
- ret = errno;
- goto error;
- }
if (fstat(fd, &st) == -1) {
ret = errno;
OpenPOWER on IntegriCloud