diff options
author | Ulrich Drepper <drepper@redhat.com> | 2000-04-12 06:08:31 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2000-04-12 06:08:31 +0000 |
commit | fb125e0ced340f0f0126cdcd3a230188007ef3f4 (patch) | |
tree | 6ed5cb0dd3c9ab842f9edc21c1c7040e6f10e3e0 /sysdeps/unix/sysv/linux/shm_open.c | |
parent | a63be9f77713b1024335c053dafd58a6cd7075bb (diff) | |
download | glibc-fb125e0ced340f0f0126cdcd3a230188007ef3f4.zip glibc-fb125e0ced340f0f0126cdcd3a230188007ef3f4.tar.gz glibc-fb125e0ced340f0f0126cdcd3a230188007ef3f4.tar.bz2 |
Update.
* sysdeps/unix/sysv/linux/shm_open.c (shm_open): Set FD_CLOEXEC
for descriptor.
Diffstat (limited to 'sysdeps/unix/sysv/linux/shm_open.c')
-rw-r--r-- | sysdeps/unix/sysv/linux/shm_open.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/sysdeps/unix/sysv/linux/shm_open.c b/sysdeps/unix/sysv/linux/shm_open.c index 08bdaea..ca24424 100644 --- a/sysdeps/unix/sysv/linux/shm_open.c +++ b/sysdeps/unix/sysv/linux/shm_open.c @@ -121,6 +121,7 @@ shm_open (const char *name, int oflag, mode_t mode) { size_t namelen; char *fname; + int fd; /* Determine where the shmfs is mounted. */ __libc_once (once, where_is_shmfs); @@ -153,7 +154,29 @@ shm_open (const char *name, int oflag, mode_t mode) file on the shmfs. If this is what should be done the whole function should be revamped since we can determine whether shmfs is available while trying to open the file, all in one turn. */ - return open (fname, oflag, mode); + fd = open (fname, oflag, mode); + if (fd != -1) + { + /* We got a descriptor. Now set the FD_CLOEXEC bit. */ + int flags = fcntl (fd, F_GETFD, 0); + + if (__builtin_expect (flags, 0) >= 0) + { + flags |= FD_CLOEXEC; + flags = fcntl (fd, F_SETFD, flags); + } + + if (flags == -1) + { + /* Something went wrong. We cannot return the descriptor. */ + int save_errno = errno; + close (fd); + fd = -1; + __set_errno (save_errno); + } + } + + return fd; } |