From patchwork Thu Apr 13 20:25:10 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Weimer X-Patchwork-Id: 20039 Received: (qmail 116663 invoked by alias); 13 Apr 2017 20:25:21 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 111611 invoked by uid 89); 13 Apr 2017 20:25:17 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=20072017, 2007-2017, start-up X-HELO: mx1.redhat.com DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 12B324E040 Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=fweimer@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 12B324E040 Date: Thu, 13 Apr 2017 22:25:10 +0200 To: libc-alpha@sourceware.org Subject: [PATCH] Assume that O_CLOEXEC is always defined and works User-Agent: Heirloom mailx 12.5 7/5/10 MIME-Version: 1.0 Message-Id: <20170413202510.40B78403B991F@oldenburg.str.redhat.com> From: fweimer@redhat.com (Florian Weimer) 2017-04-13 Florian Weimer * elf/dl-misc.c (_dl_sysdep_read_whole_file): Assume that O_CLOEXEC is defined. * include/fcntl.h (__have_o_cloexec): Remove declaration. * io/Makefile (aux): Remove. * io/have_o_cloexec.c: Remove file. * libio/fileops.c (_IO_new_file_fopen): Assume that O_CLOEXEC is defined and works. * libio/iopopen.c (_IO_new_proc_open): Assume that O_CLOEXEC is defined. * login/utmp_file.c (O_flags): Remove definition. (setutent_file): Use O_CLOEXEC instead of O_flags. Assume that O_CLOEXEC works. (pututline_file): Likewise. * malloc/mtrace.c: Assume that O_CLOEXEC works. * nis/nss_compat/compat-grp.c (__compat_have_cloexec): Remove definition. (internal_setgrent): Assume that O_CLOEXEC works. * nis/nss_compat/compat-initgroups.c (__compat_have_cloexec): Remove definition. (internal_setgrent): Assume that O_CLOEXEC works. * nis/nss_compat/compat-pwd.c (__compat_have_cloexec): Remove definition. (internal_setpwent): Assume that O_CLOEXEC works. * nis/nss_compat/compat-spwd.c (__compat_have_cloexec): Remove definition. (internal_setspent): Assume that O_CLOEXEC works. * nscd/connections.c (EXTRA_O_FLAGS): Remove definition. (nscd_init): Use O_CLOEXEC instead of EXTRA_O_FLAGS. Assume that O_CLOEXEC is defined and works. * nss/Makefile (libnss_files-routines): Remove files-have_o_cloexec. * nss/nss_db/db-open.c (internal_setent): Assume that O_CLOEXEC is defined. * nss/nss_files/files-XXX.c (internal_setent): Assume that O_CLOEXEC is defined and works. * nss/nss_files/files-alias.c (internal_setent): Likewise. * nss/nss_files/files-have_o_cloexec.c: Remove. * posix/wordexp.c (exec_comm_child, exec_comm): Assume that O_CLOEXEC is defined. * shadow/lckpwdf.c (__lckpwdf): Assume that O_CLOEXEC is defined and works. * sysdeps/mach/hurd/kernel-features.h (__ASSUME_O_CLOEXEC): Remove definition. * sysdeps/nacl/kernel-features.h (__ASSUME_O_CLOEXEC): Likewise. * sysdeps/posix/getcwd.c (__getcwd): Assume that O_CLOEXEC works. * sysdeps/posix/opendir.c (opendir_oflags): Turn into enum constant. (__opendirat, __opendir): Adjust opendir_oflags call. (check_have_o_cloexec): Remove. (__alloc_dir): Assume that O_CLOEXEC is defined and works. * sysdeps/posix/shm_open.c (shm_open): Assume that O_CLOEXEC is defined. * sysdeps/unix/sysv/linux/kernel-features.h (__ASSUME_O_CLOEXEC): Remove definition. diff --git a/elf/dl-misc.c b/elf/dl-misc.c index 1e9a6ee..c5d3e0e 100644 --- a/elf/dl-misc.c +++ b/elf/dl-misc.c @@ -45,11 +45,7 @@ _dl_sysdep_read_whole_file (const char *file, size_t *sizep, int prot) { void *result = MAP_FAILED; struct stat64 st; - int flags = O_RDONLY; -#ifdef O_CLOEXEC - flags |= O_CLOEXEC; -#endif - int fd = __open (file, flags); + int fd = __open (file, O_RDONLY | O_CLOEXEC); if (fd >= 0) { if (__fxstat64 (_STAT_VER, fd, &st) >= 0) diff --git a/include/fcntl.h b/include/fcntl.h index 3b2c887..9a007c3 100644 --- a/include/fcntl.h +++ b/include/fcntl.h @@ -36,10 +36,6 @@ extern int __openat64_2 (int __fd, const char *__path, int __oflag); /* Flag determining whether the *at system calls are available. */ extern int __have_atfcts attribute_hidden; - -#ifdef O_CLOEXEC -extern int __have_o_cloexec attribute_hidden; -#endif #endif #endif diff --git a/io/Makefile b/io/Makefile index 333a049..95e04b2 100644 --- a/io/Makefile +++ b/io/Makefile @@ -55,8 +55,6 @@ routines := \ sendfile sendfile64 \ utimensat futimens -aux := have_o_cloexec - # These routines will be omitted from the libc shared object. # Instead the static object files will be included in a special archive # linked against when the shared library will be used. diff --git a/io/have_o_cloexec.c b/io/have_o_cloexec.c deleted file mode 100644 index 295eccc..0000000 --- a/io/have_o_cloexec.c +++ /dev/null @@ -1,23 +0,0 @@ -/* Copyright (C) 2007-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include -#include - -#if defined O_CLOEXEC && !defined __ASSUME_O_CLOEXEC -int __have_o_cloexec; -#endif diff --git a/libio/fileops.c b/libio/fileops.c index f12ed16..c55e196 100644 --- a/libio/fileops.c +++ b/libio/fileops.c @@ -321,9 +321,7 @@ _IO_new_file_fopen (_IO_FILE *fp, const char *filename, const char *mode, fp->_flags2 |= _IO_FLAGS2_NOTCANCEL; continue; case 'e': -#ifdef O_CLOEXEC oflags |= O_CLOEXEC; -#endif fp->_flags2 |= _IO_FLAGS2_CLOEXEC; continue; default: @@ -338,20 +336,6 @@ _IO_new_file_fopen (_IO_FILE *fp, const char *filename, const char *mode, if (result != NULL) { -#ifndef __ASSUME_O_CLOEXEC - if ((fp->_flags2 & _IO_FLAGS2_CLOEXEC) != 0 && __have_o_cloexec <= 0) - { - int fd = _IO_fileno (fp); - if (__have_o_cloexec == 0) - { - int flags = __fcntl (fd, F_GETFD); - __have_o_cloexec = (flags & FD_CLOEXEC) == 0 ? -1 : 1; - } - if (__have_o_cloexec < 0) - __fcntl (fd, F_SETFD, FD_CLOEXEC); - } -#endif - /* Test whether the mode string specifies the conversion. */ cs = strstr (last_recognized + 1, ",ccs="); if (cs != NULL) diff --git a/libio/iopopen.c b/libio/iopopen.c index 5887bd1..6f3a7b8 100644 --- a/libio/iopopen.c +++ b/libio/iopopen.c @@ -140,13 +140,11 @@ _IO_new_proc_open (_IO_FILE *fp, const char *command, const char *mode) if (_IO_file_is_open (fp)) return NULL; -#ifdef O_CLOEXEC - { - int r = __pipe2 (pipe_fds, O_CLOEXEC); - if (r < 0) - return NULL; - } -#endif + { + int r = __pipe2 (pipe_fds, O_CLOEXEC); + if (r < 0) + return NULL; + } if (do_read) { @@ -169,12 +167,10 @@ _IO_new_proc_open (_IO_FILE *fp, const char *command, const char *mode) if (child_end != child_std_end) _IO_dup2 (child_end, child_std_end); -#ifdef O_CLOEXEC else /* The descriptor is already the one we will use. But it must not be marked close-on-exec. Undo the effects. */ __fcntl (child_end, F_SETFD, 0); -#endif /* POSIX.2: "popen() shall ensure that any streams from previous popen() calls that remain open in the parent process are closed in the new child process." */ @@ -200,11 +196,9 @@ _IO_new_proc_open (_IO_FILE *fp, const char *command, const char *mode) } if (!do_cloexec) -#ifdef O_CLOEXEC /* Undo the effects of the pipe2 call which set the close-on-exec flag. */ __fcntl (parent_end, F_SETFD, 0); -#endif _IO_fileno (fp) = parent_end; diff --git a/login/utmp_file.c b/login/utmp_file.c index b1dfb3f..6ebe1ef 100644 --- a/login/utmp_file.c +++ b/login/utmp_file.c @@ -141,42 +141,11 @@ setutent_file (void) file_name = TRANSFORM_UTMP_FILE_NAME (__libc_utmp_file_name); -#ifdef O_CLOEXEC -# define O_flags O_LARGEFILE | O_CLOEXEC -#else -# define O_flags O_LARGEFILE -#endif file_writable = false; - file_fd = open_not_cancel_2 (file_name, O_RDONLY | O_flags); + file_fd = open_not_cancel_2 + (file_name, O_RDONLY | O_LARGEFILE | O_CLOEXEC); if (file_fd == -1) return 0; - -#ifndef __ASSUME_O_CLOEXEC -# ifdef O_CLOEXEC - if (__have_o_cloexec <= 0) -# endif - { - /* We have to make sure the file is `closed on exec'. */ - int result = fcntl_not_cancel (file_fd, F_GETFD, 0); - if (result >= 0) - { -# ifdef O_CLOEXEC - if (__have_o_cloexec == 0) - __have_o_cloexec = (result & FD_CLOEXEC) ? 1 : -1; - - if (__have_o_cloexec < 0) -# endif - result = fcntl_not_cancel (file_fd, F_SETFD, - result | FD_CLOEXEC); - } - - if (result == -1) - { - close_not_cancel_no_status (file_fd); - return 0; - } - } -#endif } __lseek64 (file_fd, 0, SEEK_SET); @@ -404,37 +373,11 @@ pututline_file (const struct utmp *data) /* We must make the file descriptor writable before going on. */ const char *file_name = TRANSFORM_UTMP_FILE_NAME (__libc_utmp_file_name); - int new_fd = open_not_cancel_2 (file_name, O_RDWR | O_flags); + int new_fd = open_not_cancel_2 + (file_name, O_RDWR | O_LARGEFILE | O_CLOEXEC); if (new_fd == -1) return NULL; -#ifndef __ASSUME_O_CLOEXEC -# ifdef O_CLOEXEC - if (__have_o_cloexec <= 0) -# endif - { - /* We have to make sure the file is `closed on exec'. */ - int result = fcntl_not_cancel (file_fd, F_GETFD, 0); - if (result >= 0) - { -# ifdef O_CLOEXEC - if (__have_o_cloexec == 0) - __have_o_cloexec = (result & FD_CLOEXEC) ? 1 : -1; - - if (__have_o_cloexec < 0) -# endif - result = fcntl_not_cancel (file_fd, F_SETFD, - result | FD_CLOEXEC); - } - - if (result == -1) - { - close_not_cancel_no_status (file_fd); - return NULL; - } - } -#endif - if (__lseek64 (new_fd, __lseek64 (file_fd, 0, SEEK_CUR), SEEK_SET) == -1 || __dup2 (new_fd, file_fd) < 0) { diff --git a/malloc/mtrace.c b/malloc/mtrace.c index 800f2a8..02c53eb 100644 --- a/malloc/mtrace.c +++ b/malloc/mtrace.c @@ -300,15 +300,6 @@ mtrace (void) mallstream = fopen (mallfile != NULL ? mallfile : "/dev/null", "wce"); if (mallstream != NULL) { -#ifndef __ASSUME_O_CLOEXEC - /* Make sure we close the file descriptor on exec. */ - int flags = __fcntl (fileno (mallstream), F_GETFD, 0); - if (flags >= 0) - { - flags |= FD_CLOEXEC; - __fcntl (fileno (mallstream), F_SETFD, flags); - } -#endif /* Be sure it doesn't malloc its buffer! */ malloc_trace_buffer = mtb; setvbuf (mallstream, malloc_trace_buffer, _IOFBF, TRACE_BUFFER_SIZE); diff --git a/nis/nss_compat/compat-grp.c b/nis/nss_compat/compat-grp.c index e830a2f..0381458 100644 --- a/nis/nss_compat/compat-grp.c +++ b/nis/nss_compat/compat-grp.c @@ -70,19 +70,6 @@ static ent_t ext_ent = { TRUE, NSS_STATUS_SUCCESS, NULL, { NULL, 0, 0 }}; /* Protect global state against multiple changers. */ __libc_lock_define_initialized (static, lock) -/* Positive if O_CLOEXEC is supported, negative if it is not supported, - zero if it is still undecided. This variable is shared with the - other compat functions. */ -#ifdef __ASSUME_O_CLOEXEC -# define __compat_have_cloexec 1 -#else -# ifdef O_CLOEXEC -int __compat_have_cloexec; -# else -# define __compat_have_cloexec -1 -# endif -#endif - /* Prototypes for local functions. */ static void blacklist_store_name (const char *, ent_t *); static int in_blacklist (const char *, int, ent_t *); @@ -125,43 +112,8 @@ internal_setgrent (ent_t *ent, int stayopen, int needent) if (ent->stream == NULL) status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; else - { - /* We have to make sure the file is `closed on exec'. */ - int result = 0; - - if (__compat_have_cloexec <= 0) - { - int flags; - result = flags = fcntl (fileno_unlocked (ent->stream), F_GETFD, - 0); - if (result >= 0) - { -#if defined O_CLOEXEC && !defined __ASSUME_O_CLOEXEC - if (__compat_have_cloexec == 0) - __compat_have_cloexec = (flags & FD_CLOEXEC) ? 1 : -1; - - if (__compat_have_cloexec < 0) -#endif - { - flags |= FD_CLOEXEC; - result = fcntl (fileno_unlocked (ent->stream), F_SETFD, - flags); - } - } - } - - if (result < 0) - { - /* Something went wrong. Close the stream and return a - failure. */ - fclose (ent->stream); - ent->stream = NULL; - status = NSS_STATUS_UNAVAIL; - } - else - /* We take care of locking ourself. */ - __fsetlocking (ent->stream, FSETLOCKING_BYCALLER); - } + /* We take care of locking ourself. */ + __fsetlocking (ent->stream, FSETLOCKING_BYCALLER); } else rewind (ent->stream); diff --git a/nis/nss_compat/compat-initgroups.c b/nis/nss_compat/compat-initgroups.c index 1b37e0c..7952134 100644 --- a/nis/nss_compat/compat-initgroups.c +++ b/nis/nss_compat/compat-initgroups.c @@ -77,20 +77,6 @@ struct ent_t }; typedef struct ent_t ent_t; - -/* Positive if O_CLOEXEC is supported, negative if it is not supported, - zero if it is still undecided. This variable is shared with the - other compat functions. */ -#ifdef __ASSUME_O_CLOEXEC -# define __compat_have_cloexec 1 -#else -# ifdef O_CLOEXEC -extern int __compat_have_cloexec; -# else -# define __compat_have_cloexec -1 -# endif -#endif - /* Prototypes for local functions. */ static void blacklist_store_name (const char *, ent_t *); static int in_blacklist (const char *, int, ent_t *); @@ -141,42 +127,8 @@ internal_setgrent (ent_t *ent) if (ent->stream == NULL) status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; else - { - /* We have to make sure the file is `closed on exec'. */ - int result = 0; - - if (__compat_have_cloexec <= 0) - { - int flags; - result = flags = fcntl (fileno_unlocked (ent->stream), F_GETFD, 0); - if (result >= 0) - { -#if defined O_CLOEXEC && !defined __ASSUME_O_CLOEXEC - if (__compat_have_cloexec == 0) - __compat_have_cloexec = (flags & FD_CLOEXEC) ? 1 : -1; - - if (__compat_have_cloexec < 0) -#endif - { - flags |= FD_CLOEXEC; - result = fcntl (fileno_unlocked (ent->stream), F_SETFD, - flags); - } - } - } - - if (result < 0) - { - /* Something went wrong. Close the stream and return a - failure. */ - fclose (ent->stream); - ent->stream = NULL; - status = NSS_STATUS_UNAVAIL; - } - else - /* We take care of locking ourself. */ - __fsetlocking (ent->stream, FSETLOCKING_BYCALLER); - } + /* We take care of locking ourself. */ + __fsetlocking (ent->stream, FSETLOCKING_BYCALLER); return status; } diff --git a/nis/nss_compat/compat-pwd.c b/nis/nss_compat/compat-pwd.c index 28ae7fb..0583a10 100644 --- a/nis/nss_compat/compat-pwd.c +++ b/nis/nss_compat/compat-pwd.c @@ -80,19 +80,6 @@ static ent_t ext_ent = { false, false, true, NSS_STATUS_SUCCESS, NULL, /* Protect global state against multiple changers. */ __libc_lock_define_initialized (static, lock) -/* Positive if O_CLOEXEC is supported, negative if it is not supported, - zero if it is still undecided. This variable is shared with the - other compat functions. */ -#ifdef __ASSUME_O_CLOEXEC -# define __compat_have_cloexec 1 -#else -# ifdef O_CLOEXEC -extern int __compat_have_cloexec; -# else -# define __compat_have_cloexec -1 -# endif -#endif - /* Prototypes for local functions. */ static void blacklist_store_name (const char *, ent_t *); static int in_blacklist (const char *, int, ent_t *); @@ -240,43 +227,8 @@ internal_setpwent (ent_t *ent, int stayopen, int needent) if (ent->stream == NULL) status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; else - { - /* We have to make sure the file is `closed on exec'. */ - int result = 0; - - if (__compat_have_cloexec <= 0) - { - int flags; - result = flags = fcntl (fileno_unlocked (ent->stream), F_GETFD, - 0); - if (result >= 0) - { -#if defined O_CLOEXEC && !defined __ASSUME_O_CLOEXEC - if (__compat_have_cloexec == 0) - __compat_have_cloexec = (flags & FD_CLOEXEC) ? 1 : -1; - - if (__compat_have_cloexec < 0) -#endif - { - flags |= FD_CLOEXEC; - result = fcntl (fileno_unlocked (ent->stream), F_SETFD, - flags); - } - } - } - - if (result < 0) - { - /* Something went wrong. Close the stream and return a - failure. */ - fclose (ent->stream); - ent->stream = NULL; - status = NSS_STATUS_UNAVAIL; - } - else - /* We take care of locking ourself. */ - __fsetlocking (ent->stream, FSETLOCKING_BYCALLER); - } + /* We take care of locking ourself. */ + __fsetlocking (ent->stream, FSETLOCKING_BYCALLER); } else rewind (ent->stream); diff --git a/nis/nss_compat/compat-spwd.c b/nis/nss_compat/compat-spwd.c index 550444c..eec3af3 100644 --- a/nis/nss_compat/compat-spwd.c +++ b/nis/nss_compat/compat-spwd.c @@ -77,19 +77,6 @@ static ent_t ext_ent = { false, true, false, NSS_STATUS_SUCCESS, NULL, /* Protect global state against multiple changers. */ __libc_lock_define_initialized (static, lock) -/* Positive if O_CLOEXEC is supported, negative if it is not supported, - zero if it is still undecided. This variable is shared with the - other compat functions. */ -#ifdef __ASSUME_O_CLOEXEC -# define __compat_have_cloexec 1 -#else -# ifdef O_CLOEXEC -extern int __compat_have_cloexec; -# else -# define __compat_have_cloexec -1 -# endif -#endif - /* Prototypes for local functions. */ static void blacklist_store_name (const char *, ent_t *); static int in_blacklist (const char *, int, ent_t *); @@ -196,43 +183,8 @@ internal_setspent (ent_t *ent, int stayopen, int needent) if (ent->stream == NULL) status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; else - { - /* We have to make sure the file is `closed on exec'. */ - int result = 0; - - if (__compat_have_cloexec <= 0) - { - int flags; - result = flags = fcntl (fileno_unlocked (ent->stream), F_GETFD, - 0); - if (result >= 0) - { -#if defined O_CLOEXEC && !defined __ASSUME_O_CLOEXEC - if (__compat_have_cloexec == 0) - __compat_have_cloexec = (flags & FD_CLOEXEC) ? 1 : -1; - - if (__compat_have_cloexec < 0) -#endif - { - flags |= FD_CLOEXEC; - result = fcntl (fileno_unlocked (ent->stream), F_SETFD, - flags); - } - } - } - - if (result < 0) - { - /* Something went wrong. Close the stream and return a - failure. */ - fclose (ent->stream); - ent->stream = NULL; - status = NSS_STATUS_UNAVAIL; - } - else - /* We take care of locking ourself. */ - __fsetlocking (ent->stream, FSETLOCKING_BYCALLER); - } + /* We take care of locking ourself. */ + __fsetlocking (ent->stream, FSETLOCKING_BYCALLER); } else rewind (ent->stream); diff --git a/nscd/connections.c b/nscd/connections.c index 205ff42..a5ca57a 100644 --- a/nscd/connections.c +++ b/nscd/connections.c @@ -499,13 +499,6 @@ fail: } -#ifdef O_CLOEXEC -# define EXTRA_O_FLAGS O_CLOEXEC -#else -# define EXTRA_O_FLAGS 0 -#endif - - /* Initialize database information structures. */ void nscd_init (void) @@ -528,7 +521,7 @@ nscd_init (void) if (dbs[cnt].persistent) { /* Try to open the appropriate file on disk. */ - int fd = open (dbs[cnt].db_filename, O_RDWR | EXTRA_O_FLAGS); + int fd = open (dbs[cnt].db_filename, O_RDWR | O_CLOEXEC); if (fd != -1) { char *msg = NULL; @@ -608,7 +601,7 @@ nscd_init (void) if (dbs[cnt].shared) { dbs[cnt].ro_fd = open (dbs[cnt].db_filename, - O_RDONLY | EXTRA_O_FLAGS); + O_RDONLY | O_CLOEXEC); if (dbs[cnt].ro_fd == -1) dbg_log (_("\ cannot create read-only descriptor for \"%s\"; no mmap"), @@ -648,23 +641,23 @@ cannot create read-only descriptor for \"%s\"; no mmap"), if (dbs[cnt].persistent) { fd = open (dbs[cnt].db_filename, - O_RDWR | O_CREAT | O_EXCL | O_TRUNC | EXTRA_O_FLAGS, + O_RDWR | O_CREAT | O_EXCL | O_TRUNC | O_CLOEXEC, S_IRUSR | S_IWUSR); if (fd != -1 && dbs[cnt].shared) ro_fd = open (dbs[cnt].db_filename, - O_RDONLY | EXTRA_O_FLAGS); + O_RDONLY | O_CLOEXEC); } else { char fname[] = _PATH_NSCD_XYZ_DB_TMP; - fd = mkostemp (fname, EXTRA_O_FLAGS); + fd = mkostemp (fname, O_CLOEXEC); /* We do not need the file name anymore after we opened another file descriptor in read-only mode. */ if (fd != -1) { if (dbs[cnt].shared) - ro_fd = open (fname, O_RDONLY | EXTRA_O_FLAGS); + ro_fd = open (fname, O_RDONLY | O_CLOEXEC); unlink (fname); } @@ -782,24 +775,6 @@ cannot create read-only descriptor for \"%s\"; no mmap"), } } -#if !defined O_CLOEXEC || !defined __ASSUME_O_CLOEXEC - /* We do not check here whether the O_CLOEXEC provided to the - open call was successful or not. The two fcntl calls are - only performed once each per process start-up and therefore - is not noticeable at all. */ - if (paranoia - && ((dbs[cnt].wr_fd != -1 - && fcntl (dbs[cnt].wr_fd, F_SETFD, FD_CLOEXEC) == -1) - || (dbs[cnt].ro_fd != -1 - && fcntl (dbs[cnt].ro_fd, F_SETFD, FD_CLOEXEC) == -1))) - { - dbg_log (_("\ -cannot set socket to close on exec: %s; disabling paranoia mode"), - strerror (errno)); - paranoia = 0; - } -#endif - if (dbs[cnt].head == NULL) { /* We do not use the persistent database. Just diff --git a/nss/Makefile b/nss/Makefile index de6c47a..fa0418e 100644 --- a/nss/Makefile +++ b/nss/Makefile @@ -74,7 +74,7 @@ vpath %.c $(subdir-dirs) ../locale/programs ../intl libnss_files-routines := $(addprefix files-,$(databases)) \ - files-initgroups files-have_o_cloexec files-init + files-initgroups files-init libnss_db-dbs := $(addprefix db-,\ $(filter-out hosts network key alias,\ diff --git a/nss/nss_db/db-open.c b/nss/nss_db/db-open.c index 42ce00f..1c58bd1 100644 --- a/nss/nss_db/db-open.c +++ b/nss/nss_db/db-open.c @@ -36,11 +36,7 @@ internal_setent (const char *file, struct nss_db_map *mapping) { enum nss_status status = NSS_STATUS_UNAVAIL; - int mode = O_RDONLY | O_LARGEFILE; -#ifdef O_CLOEXEC - mode |= O_CLOEXEC; -#endif - int fd = open_not_cancel_2 (file, mode); + int fd = open_not_cancel_2 (file, O_RDONLY | O_LARGEFILE | O_CLOEXEC); if (fd != -1) { struct nss_db_header header; diff --git a/nss/nss_files/files-XXX.c b/nss/nss_files/files-XXX.c index dbd38a3..265331e 100644 --- a/nss/nss_files/files-XXX.c +++ b/nss/nss_files/files-XXX.c @@ -78,41 +78,6 @@ internal_setent (FILE **stream) if (*stream == NULL) status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; - else - { -#if !defined O_CLOEXEC || !defined __ASSUME_O_CLOEXEC -# ifdef O_CLOEXEC - if (__have_o_cloexec <= 0) -# endif - { - /* We have to make sure the file is `closed on exec'. */ - int result; - int flags; - - result = flags = fcntl (fileno (*stream), F_GETFD, 0); - if (result >= 0) - { -# ifdef O_CLOEXEC - if (__have_o_cloexec == 0) - __have_o_cloexec = (flags & FD_CLOEXEC) == 0 ? -1 : 1; - if (__have_o_cloexec < 0) -# endif - { - flags |= FD_CLOEXEC; - result = fcntl (fileno (*stream), F_SETFD, flags); - } - } - if (result < 0) - { - /* Something went wrong. Close the stream and return a - failure. */ - fclose (*stream); - *stream = NULL; - status = NSS_STATUS_UNAVAIL; - } - } -#endif - } } else rewind (*stream); diff --git a/nss/nss_files/files-alias.c b/nss/nss_files/files-alias.c index de4e364..cf872bb 100644 --- a/nss/nss_files/files-alias.c +++ b/nss/nss_files/files-alias.c @@ -51,41 +51,6 @@ internal_setent (FILE **stream) if (*stream == NULL) status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; - else - { -#if !defined O_CLOEXEC || !defined __ASSUME_O_CLOEXEC -# ifdef O_CLOEXEC - if (__have_o_cloexec <= 0) -# endif - { - /* We have to make sure the file is `closed on exec'. */ - int result; - int flags; - - result = flags = fcntl (fileno (*stream), F_GETFD, 0); - if (result >= 0) - { -# ifdef O_CLOEXEC - if (__have_o_cloexec == 0) - __have_o_cloexec = (flags & FD_CLOEXEC) == 0 ? -1 : 1; - if (__have_o_cloexec < 0) -# endif - { - flags |= FD_CLOEXEC; - result = fcntl (fileno (*stream), F_SETFD, flags); - } - } - if (result < 0) - { - /* Something went wrong. Close the stream and return a - failure. */ - fclose (*stream); - stream = NULL; - status = NSS_STATUS_UNAVAIL; - } - } -#endif - } } else rewind (*stream); diff --git a/nss/nss_files/files-have_o_cloexec.c b/nss/nss_files/files-have_o_cloexec.c deleted file mode 100644 index 295eccc..0000000 --- a/nss/nss_files/files-have_o_cloexec.c +++ /dev/null @@ -1,23 +0,0 @@ -/* Copyright (C) 2007-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include -#include - -#if defined O_CLOEXEC && !defined __ASSUME_O_CLOEXEC -int __have_o_cloexec; -#endif diff --git a/posix/wordexp.c b/posix/wordexp.c index 639d73e..ee83838 100644 --- a/posix/wordexp.c +++ b/posix/wordexp.c @@ -833,12 +833,8 @@ exec_comm_child (char *comm, int *fildes, int showerr, int noexec) __close (fildes[1]); } else - { -#ifdef O_CLOEXEC - /* Reset the close-on-exec flag (if necessary). */ - __fcntl (fildes[1], F_SETFD, 0); -#endif - } + /* Reset the close-on-exec flag (if necessary). */ + __fcntl (fildes[1], F_SETFD, 0); /* Redirect stderr to /dev/null if we have to. */ if (showerr == 0) @@ -902,14 +898,12 @@ exec_comm (char *comm, char **word, size_t *word_length, size_t *max_length, if (!comm || !*comm) return 0; -#ifdef O_CLOEXEC { int r = __pipe2 (fildes, O_CLOEXEC); if (r < 0) /* Bad */ return WRDE_NOSPACE; } -#endif again: if ((pid = __fork ()) < 0) diff --git a/shadow/lckpwdf.c b/shadow/lckpwdf.c index 5e9a976..09427eb 100644 --- a/shadow/lckpwdf.c +++ b/shadow/lckpwdf.c @@ -96,39 +96,12 @@ __lckpwdf (void) /* Prevent problems caused by multiple threads. */ __libc_lock_lock (lock); - int oflags = O_WRONLY | O_CREAT; -#ifdef O_CLOEXEC - oflags |= O_CLOEXEC; -#endif + int oflags = O_WRONLY | O_CREAT | O_CLOEXEC; lock_fd = __open (PWD_LOCKFILE, oflags, 0600); if (lock_fd == -1) /* Cannot create lock file. */ RETURN_CLOSE_FD (-1); -#ifndef __ASSUME_O_CLOEXEC -# ifdef O_CLOEXEC - if (__have_o_cloexec <= 0) -# endif - { - /* Make sure file gets correctly closed when process finished. */ - int flags = __fcntl (lock_fd, F_GETFD, 0); - if (flags == -1) - /* Cannot get file flags. */ - RETURN_CLOSE_FD (-1); -# ifdef O_CLOEXEC - if (__have_o_cloexec == 0) - __have_o_cloexec = (flags & FD_CLOEXEC) == 0 ? -1 : 1; - if (__have_o_cloexec < 0) -# endif - { - flags |= FD_CLOEXEC; /* Close on exit. */ - if (__fcntl (lock_fd, F_SETFD, flags) < 0) - /* Cannot set new flags. */ - RETURN_CLOSE_FD (-1); - } - } -#endif - /* Now we have to get exclusive write access. Since multiple process could try this we won't stop when it first fails. Instead we set a timeout for the system call. Once the timer diff --git a/sysdeps/mach/hurd/kernel-features.h b/sysdeps/mach/hurd/kernel-features.h index 60c5bca..20cb3ba 100644 --- a/sysdeps/mach/hurd/kernel-features.h +++ b/sysdeps/mach/hurd/kernel-features.h @@ -20,5 +20,4 @@ Almost none of these are used outside of sysdeps/unix/sysv/linux code. But those referring to POSIX-level features like O_* flags can be. */ -#define __ASSUME_O_CLOEXEC 1 #define __ASSUME_ACCEPT4 1 diff --git a/sysdeps/nacl/kernel-features.h b/sysdeps/nacl/kernel-features.h index 4a5808b..32834fd 100644 --- a/sysdeps/nacl/kernel-features.h +++ b/sysdeps/nacl/kernel-features.h @@ -20,8 +20,6 @@ Almost none of these are used outside of sysdeps/unix/sysv/linux code. But those referring to POSIX-level features like O_* flags can be. */ -#define __ASSUME_O_CLOEXEC 1 - /* #define __ASSUME_ACCEPT4 1 */ diff --git a/sysdeps/posix/getcwd.c b/sysdeps/posix/getcwd.c index 0246e91..eb1706a 100644 --- a/sysdeps/posix/getcwd.c +++ b/sysdeps/posix/getcwd.c @@ -281,13 +281,7 @@ __getcwd (char *buf, size_t size) while (!(thisdev == rootdev && thisino == rootino)) { if (__have_atfcts >= 0) - { - int mode = O_RDONLY; -#ifdef O_CLOEXEC - mode |= O_CLOEXEC; -#endif - fd = openat64_not_cancel_3 (fd, "..", mode); - } + fd = openat64_not_cancel_3 (fd, "..", O_RDONLY | O_CLOEXEC); else fd = -1; if (fd >= 0) diff --git a/sysdeps/posix/opendir.c b/sysdeps/posix/opendir.c index 75d833a..909aa61 100644 --- a/sysdeps/posix/opendir.c +++ b/sysdeps/posix/opendir.c @@ -81,6 +81,9 @@ tryopen_o_directory (void) # define EXTRA_FLAGS 0 #endif +enum { + opendir_oflags = O_RDONLY|O_NDELAY|EXTRA_FLAGS|O_LARGEFILE|O_CLOEXEC +}; static bool invalid_name (const char *name) @@ -110,18 +113,6 @@ need_isdir_precheck (void) return true; } - -static int -opendir_oflags (void) -{ - int flags = O_RDONLY|O_NDELAY|EXTRA_FLAGS|O_LARGEFILE; -#ifdef O_CLOEXEC - flags |= O_CLOEXEC; -#endif - return flags; -} - - static DIR * opendir_tail (int fd) { @@ -170,7 +161,7 @@ __opendirat (int dfd, const char *name) } } - return opendir_tail (openat_not_cancel_3 (dfd, name, opendir_oflags ())); + return opendir_tail (openat_not_cancel_3 (dfd, name, opendir_oflags)); } #endif @@ -197,39 +188,19 @@ __opendir (const char *name) } } - return opendir_tail (open_not_cancel_2 (name, opendir_oflags ())); + return opendir_tail (open_not_cancel_2 (name, opendir_oflags)); } weak_alias (__opendir, opendir) - -#ifdef __ASSUME_O_CLOEXEC -# define check_have_o_cloexec(fd) 1 -#else -static int -check_have_o_cloexec (int fd) -{ - if (__have_o_cloexec == 0) - __have_o_cloexec = (__fcntl (fd, F_GETFD, 0) & FD_CLOEXEC) == 0 ? -1 : 1; - return __have_o_cloexec > 0; -} -#endif - - DIR * internal_function __alloc_dir (int fd, bool close_fd, int flags, const struct stat64 *statp) { - /* We always have to set the close-on-exit flag if the user provided - the file descriptor. Otherwise only if we have no working - O_CLOEXEC support. */ -#ifdef O_CLOEXEC - if ((! close_fd && (flags & O_CLOEXEC) == 0) - || ! check_have_o_cloexec (fd)) -#endif - { - if (__builtin_expect (__fcntl (fd, F_SETFD, FD_CLOEXEC), 0) < 0) + /* We have to set the close-on-exit flag if the user provided the + file descriptor. */ + if (!close_fd + && __builtin_expect (__fcntl (fd, F_SETFD, FD_CLOEXEC), 0) < 0) goto lose; - } const size_t default_allocation = (4 * BUFSIZ < sizeof (struct dirent64) ? sizeof (struct dirent64) : 4 * BUFSIZ); diff --git a/sysdeps/posix/shm_open.c b/sysdeps/posix/shm_open.c index 56a9965..64315de 100644 --- a/sysdeps/posix/shm_open.c +++ b/sysdeps/posix/shm_open.c @@ -34,10 +34,7 @@ shm_open (const char *name, int oflag, mode_t mode) { SHM_GET_NAME (EINVAL, -1, ""); - oflag |= O_NOFOLLOW; -# ifdef O_CLOEXEC - oflag |= O_CLOEXEC; -# endif + oflag |= O_NOFOLLOW | O_CLOEXEC; /* Disable asynchronous cancellation. */ int state; @@ -50,29 +47,6 @@ shm_open (const char *name, int oflag, mode_t mode) object names and the standard does not mention EISDIR. */ __set_errno (EINVAL); -# ifndef O_CLOEXEC - if (fd != -1) - { - /* We got a descriptor. Now set the FD_CLOEXEC bit. */ - int flags = fcntl (fd, F_GETFD, 0); - - if (__glibc_likely (flags != -1)) - { - 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); - } - } -# endif - pthread_setcancelstate (state, NULL); return fd; diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h index e0eb4e2..fd936c5 100644 --- a/sysdeps/unix/sysv/linux/kernel-features.h +++ b/sysdeps/unix/sysv/linux/kernel-features.h @@ -68,10 +68,6 @@ #define __ASSUME_PRIVATE_FUTEX 1 /* Support for various CLOEXEC and NONBLOCK flags was added in - 2.6.23. */ -#define __ASSUME_O_CLOEXEC 1 - -/* Support for various CLOEXEC and NONBLOCK flags was added in 2.6.27. */ #define __ASSUME_IN_NONBLOCK 1