diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2017-07-03 15:22:58 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2017-08-18 18:38:55 -0300 |
commit | c181840c93d3a8fcb50991b2326c40f34eb5e82b (patch) | |
tree | 1a3b09841652c71dc33b608b6a55006bf6106e59 /sysdeps/unix | |
parent | 0bb2fabcb3bcac064a3d89917c0736353cdac2f4 (diff) | |
download | glibc-c181840c93d3a8fcb50991b2326c40f34eb5e82b.tar.gz glibc-c181840c93d3a8fcb50991b2326c40f34eb5e82b.tar.xz glibc-c181840c93d3a8fcb50991b2326c40f34eb5e82b.zip |
Consolidate non cancellable close call
This patch consolidates all the non cancellable close calls to use the __close_nocancel{_nostatus} identifier. For non cancellable targets it will be just a macro to call the default respective symbol while on Linux will be a internal one. Also, since it is used on libcrypto it is also exported in GLIBC_PRIVATE namespace. Checked on x86_64-linux-gnu, x86_64-linux-gnu-x32, and i686-linux-gnu. * sysdeps/generic/not-cancel.h (close_not_cancel): Remove macro. (close_not_cancel_no_status): Likewise. (__close_nocancel): New macro. (__close_nocancel_no_status): Likewise. * sysdeps/unix/sysv/linux/not-cancel.h (__close_nocancel): Remove macro. (close_not_cancel): Likewise. (close_not_cancel_no_status): Likewise. (__close_nocancel): New prototype. (__close_nocancel_no_status): New function. * sysdeps/unix/sysv/linux/close.c (__close_nocancel): New function. * catgets/open_catalog.c (__open_catalog): Replace close_not_cancel{_no_status) with __close_nocancel{_nostatus}. * gmon/gmon.c (write_gmon): Likewise. * iconv/gconv_cache.c (__gconv_load_cache): Likewise. * intl/loadmsgcat.c (close): Likewise. * io/ftw.c (open_dir_stream): Likewise. (ftw_startup): Likewise. * libio/fileops.c (_IO_file_open): Likewise. (_IO_file_close_mmap): Likewise. (_IO_file_close): Likewise. * libio/iopopen.c (_IO_dup2): Likewise. * locale/loadarchive.c (_nl_load_locale_from_archive): Likewise. * locale/loadlocale.c (_nl_load_locale): Likewise. * login/utmp_file.c (pututline_file): Likewise. (endutent_file): Likewise. * misc/daemon.c (daemon): Likewise. * nscd/nscd_getai.c (__nscd_getai): Likewise. * nscd/nscd_getgr_r.c (nscd_getgr_r): Likewise. * nscd/nscd_gethst_r.c (nscd_gethst_r): Likewise. * nscd/nscd_getpw_r.c (nscd_getpw_r): Likewise. * nscd/nscd_getserv_r.c (nscd_getserv_r): Likewise. * nscd/nscd_helper.c (open_socket): Likewise. (__nscd_open_socket): Likewise. * nscd/nscd_initgroups.c (__nscd_getgrouplist): Likewise. * nscd/nscd_netgroup.c (__nscd_setnetgrent): Likewise. (__nscd_innetgr): Likewise. * nss/nss_db/db-open.c (internal_setent): Likewise. * resolv/res-close.c (__res_iclose): Likewise. * sunrpc/pm_getmaps.c (pmap_getmaps): Likewise. * sysdeps/posix/closedir.c (__closedir): Likewise. * sysdeps/posix/getaddrinfo.c (getaddrinfo): Likewise. * sysdeps/posix/getcwd.c (__getcwd): Likewise. * sysdeps/posix/opendir.c (tryopen_o_directory): Likewise. (opendir_tail): Likewise. * sysdeps/posix/spawni.c (__spawni_child): Likewise. * sysdeps/unix/sysv/linux/check_native.c (__check_native): Likewise. * sysdeps/unix/sysv/linux/check_pf.c (__check_pf): Likewise. * sysdeps/unix/sysv/linux/fips-private.h (fips_enabled_p): Likewise. * sysdeps/unix/sysv/linux/gethostid.c (sethostid): Likewise. (gethostid): Likewise. * sysdeps/unix/sysv/linux/getloadavg.c (getloadavg): Likewise. * sysdeps/unix/sysv/linux/getlogin_r.c (__getlogin_r_loginuid): Likewise. * sysdeps/unix/sysv/linux/getsysstats.c (__get_nprocs): Likewise. * sysdeps/unix/sysv/linux/grantpt.c (close_all_fds): Likewise. * sysdeps/unix/sysv/linux/i386/smp.h (is_smp_system): Likewise. * sysdeps/unix/sysv/linux/ia64/has_cpuclock.c (has_cpuclock): Likewise. * sysdeps/unix/sysv/linux/if_index.c (__if_nametoindex): Likewise. * sysdeps/unix/sysv/linux/libc_fatal.c (backtrace_and_maps): Likewise. * sysdeps/unix/sysv/linux/malloc-sysdep.h (check_may_shrink_heap): Likewise. * sysdeps/unix/sysv/linux/mq_notify.c (init_mq_netlink): Likewise. * sysdeps/unix/sysv/linux/pthread_getname.c (pthread_getname_np): Likewise. * sysdeps/unix/sysv/linux/pthread_setname.c (pthread_setname_np): Likewise. * sysdeps/unix/sysv/linux/spawni.c (__spawni_child): Likewise. * sysdeps/unix/sysv/linux/sysconf.c (__sysconf): Likewise.
Diffstat (limited to 'sysdeps/unix')
21 files changed, 48 insertions, 32 deletions
diff --git a/sysdeps/unix/sysv/linux/Versions b/sysdeps/unix/sysv/linux/Versions index b553514c27..6c9e06f4f9 100644 --- a/sysdeps/unix/sysv/linux/Versions +++ b/sysdeps/unix/sysv/linux/Versions @@ -171,6 +171,7 @@ libc { __syscall_rt_sigqueueinfo; __open_nocancel; __read_nocancel; + __close_nocancel; # functions used by nscd __netlink_assert_response; } diff --git a/sysdeps/unix/sysv/linux/check_native.c b/sysdeps/unix/sysv/linux/check_native.c index 7e5a7c9be3..dc2da83552 100644 --- a/sysdeps/unix/sysv/linux/check_native.c +++ b/sysdeps/unix/sysv/linux/check_native.c @@ -167,7 +167,7 @@ __check_native (uint32_t a1_index, int *a1_native, while (! done); out: - close_not_cancel_no_status (fd); + __close_nocancel_nostatus (fd); return; diff --git a/sysdeps/unix/sysv/linux/check_pf.c b/sysdeps/unix/sysv/linux/check_pf.c index 3bf221a177..4dd0275144 100644 --- a/sysdeps/unix/sysv/linux/check_pf.c +++ b/sysdeps/unix/sysv/linux/check_pf.c @@ -328,7 +328,7 @@ __check_pf (bool *seen_ipv4, bool *seen_ipv6, &addr_len) == 0) data = make_request (fd, nladdr.nl_pid); - close_not_cancel_no_status (fd); + __close_nocancel_nostatus (fd); } if (data != NULL) diff --git a/sysdeps/unix/sysv/linux/close.c b/sysdeps/unix/sysv/linux/close.c index 1ac71ce980..dd21d8d5fb 100644 --- a/sysdeps/unix/sysv/linux/close.c +++ b/sysdeps/unix/sysv/linux/close.c @@ -18,6 +18,7 @@ #include <unistd.h> #include <sysdep-cancel.h> +#include <not-cancel.h> /* Close the file descriptor FD. */ int @@ -28,3 +29,14 @@ __close (int fd) libc_hidden_def (__close) strong_alias (__close, __libc_close) weak_alias (__close, close) + +# if !IS_IN (rtld) +int +__close_nocancel (int fd) +{ + return INLINE_SYSCALL_CALL (close, fd); +} +#else +strong_alias (__libc_close, __close_nocancel) +#endif +libc_hidden_def (__close_nocancel) diff --git a/sysdeps/unix/sysv/linux/fips-private.h b/sysdeps/unix/sysv/linux/fips-private.h index 775f2c2b50..23833f03fb 100644 --- a/sysdeps/unix/sysv/linux/fips-private.h +++ b/sysdeps/unix/sysv/linux/fips-private.h @@ -50,7 +50,7 @@ fips_enabled_p (void) char buf[32]; ssize_t n; n = TEMP_FAILURE_RETRY (__read_nocancel (fd, buf, sizeof (buf) - 1)); - close_not_cancel_no_status (fd); + __close_nocancel_nostatus (fd); if (n > 0) { diff --git a/sysdeps/unix/sysv/linux/gethostid.c b/sysdeps/unix/sysv/linux/gethostid.c index 11c7e7321b..ca03877238 100644 --- a/sysdeps/unix/sysv/linux/gethostid.c +++ b/sysdeps/unix/sysv/linux/gethostid.c @@ -53,7 +53,7 @@ sethostid (long int id) written = __write_nocancel (fd, &id32, sizeof (id32)); - close_not_cancel_no_status (fd); + __close_nocancel_nostatus (fd); return written != sizeof (id32) ? -1 : 0; } @@ -82,7 +82,7 @@ gethostid (void) { ssize_t n = __read_nocancel (fd, &id, sizeof (id)); - close_not_cancel_no_status (fd); + __close_nocancel_nostatus (fd); if (n == sizeof (id)) return id; diff --git a/sysdeps/unix/sysv/linux/getloadavg.c b/sysdeps/unix/sysv/linux/getloadavg.c index 64bad17046..4b75741809 100644 --- a/sysdeps/unix/sysv/linux/getloadavg.c +++ b/sysdeps/unix/sysv/linux/getloadavg.c @@ -43,7 +43,7 @@ getloadavg (double loadavg[], int nelem) int i; nread = __read_nocancel (fd, buf, sizeof buf - 1); - close_not_cancel_no_status (fd); + __close_nocancel_nostatus (fd); if (nread <= 0) return -1; buf[nread - 1] = '\0'; diff --git a/sysdeps/unix/sysv/linux/getlogin_r.c b/sysdeps/unix/sysv/linux/getlogin_r.c index 1de746b3d3..45c468f5a1 100644 --- a/sysdeps/unix/sysv/linux/getlogin_r.c +++ b/sysdeps/unix/sysv/linux/getlogin_r.c @@ -43,7 +43,7 @@ __getlogin_r_loginuid (char *name, size_t namesize) char uidbuf[12]; ssize_t n = TEMP_FAILURE_RETRY (__read_nocancel (fd, uidbuf, sizeof (uidbuf))); - close_not_cancel_no_status (fd); + __close_nocancel_nostatus (fd); uid_t uid; char *endp; diff --git a/sysdeps/unix/sysv/linux/getsysstats.c b/sysdeps/unix/sysv/linux/getsysstats.c index d1400d6cc6..d02c86d739 100644 --- a/sysdeps/unix/sysv/linux/getsysstats.c +++ b/sysdeps/unix/sysv/linux/getsysstats.c @@ -180,7 +180,7 @@ __get_nprocs (void) } while (l < re); - close_not_cancel_no_status (fd); + __close_nocancel_nostatus (fd); if (result > 0) goto out; @@ -207,7 +207,7 @@ __get_nprocs (void) else if (isdigit (l[3])) ++result; - close_not_cancel_no_status (fd); + __close_nocancel_nostatus (fd); } else { @@ -215,7 +215,7 @@ __get_nprocs (void) if (fd != -1) { GET_NPROCS_PARSER (fd, buffer, cp, re, buffer_end, result); - close_not_cancel_no_status (fd); + __close_nocancel_nostatus (fd); } } diff --git a/sysdeps/unix/sysv/linux/grantpt.c b/sysdeps/unix/sysv/linux/grantpt.c index 97c6ba7997..2030e07fa6 100644 --- a/sysdeps/unix/sysv/linux/grantpt.c +++ b/sysdeps/unix/sysv/linux/grantpt.c @@ -26,7 +26,7 @@ close_all_fds (void) char *endp; long int fd = strtol (d->d_name, &endp, 10); if (*endp == '\0' && fd != PTY_FILENO && fd != dirfd (dir)) - close_not_cancel_no_status (fd); + __close_nocancel_nostatus (fd); } __closedir (dir); diff --git a/sysdeps/unix/sysv/linux/i386/smp.h b/sysdeps/unix/sysv/linux/i386/smp.h index eb1ac5ddea..320958ae98 100644 --- a/sysdeps/unix/sysv/linux/i386/smp.h +++ b/sysdeps/unix/sysv/linux/i386/smp.h @@ -47,7 +47,7 @@ is_smp_system (void) /* This also didn't work. We give up and say it's a UP machine. */ u.buf[0] = '\0'; - close_not_cancel_no_status (fd); + __close_nocancel_nostatus (fd); cp = u.buf; } diff --git a/sysdeps/unix/sysv/linux/ia64/has_cpuclock.c b/sysdeps/unix/sysv/linux/ia64/has_cpuclock.c index 6aab1e87a6..79c95b4bd9 100644 --- a/sysdeps/unix/sysv/linux/ia64/has_cpuclock.c +++ b/sysdeps/unix/sysv/linux/ia64/has_cpuclock.c @@ -41,7 +41,7 @@ has_cpuclock (void) || buf[0] != '0' || buf[1] != '\n') newval = -1; - close_not_cancel_no_status (fd); + __close_nocancel_nostatus (fd); } itc_usable = newval; diff --git a/sysdeps/unix/sysv/linux/if_index.c b/sysdeps/unix/sysv/linux/if_index.c index 8ba5eae781..56f3f136cb 100644 --- a/sysdeps/unix/sysv/linux/if_index.c +++ b/sysdeps/unix/sysv/linux/if_index.c @@ -47,12 +47,12 @@ __if_nametoindex (const char *ifname) if (__ioctl (fd, SIOCGIFINDEX, &ifr) < 0) { int saved_errno = errno; - close_not_cancel_no_status (fd); + __close_nocancel_nostatus (fd); if (saved_errno == EINVAL) __set_errno (ENOSYS); return 0; } - close_not_cancel_no_status (fd); + __close_nocancel_nostatus (fd); return ifr.ifr_ifindex; #endif } @@ -224,7 +224,7 @@ __if_indextoname (unsigned int ifindex, char *ifname) ifr.ifr_ifindex = ifindex; status = __ioctl (fd, SIOCGIFNAME, &ifr); - close_not_cancel_no_status (fd); + __close_nocancel_nostatus (fd); if (status < 0) { diff --git a/sysdeps/unix/sysv/linux/libc_fatal.c b/sysdeps/unix/sysv/linux/libc_fatal.c index c7c6a07004..4bc152145c 100644 --- a/sysdeps/unix/sysv/linux/libc_fatal.c +++ b/sysdeps/unix/sysv/linux/libc_fatal.c @@ -59,7 +59,7 @@ backtrace_and_maps (int do_abort, bool written, int fd) while ((n2 = __read_nocancel (fd2, buf, sizeof (buf))) > 0) if (__write_nocancel (fd, buf, n2) != n2) break; - close_not_cancel_no_status (fd2); + __close_nocancel_nostatus (fd2); } } } diff --git a/sysdeps/unix/sysv/linux/malloc-sysdep.h b/sysdeps/unix/sysv/linux/malloc-sysdep.h index 7a7acbadb8..4bb7bc0a1d 100644 --- a/sysdeps/unix/sysv/linux/malloc-sysdep.h +++ b/sysdeps/unix/sysv/linux/malloc-sysdep.h @@ -49,7 +49,7 @@ check_may_shrink_heap (void) char val; ssize_t n = __read_nocancel (fd, &val, 1); may_shrink_heap = n > 0 && val == '2'; - close_not_cancel_no_status (fd); + __close_nocancel_nostatus (fd); } } diff --git a/sysdeps/unix/sysv/linux/mq_notify.c b/sysdeps/unix/sysv/linux/mq_notify.c index 626430ccc7..f12e6f52c1 100644 --- a/sysdeps/unix/sysv/linux/mq_notify.c +++ b/sysdeps/unix/sysv/linux/mq_notify.c @@ -209,7 +209,7 @@ init_mq_netlink (void) if (err != 0) { - close_not_cancel_no_status (netlink_socket); + __close_nocancel_nostatus (netlink_socket); netlink_socket = -1; } } diff --git a/sysdeps/unix/sysv/linux/not-cancel.h b/sysdeps/unix/sysv/linux/not-cancel.h index 08ad773486..51824515da 100644 --- a/sysdeps/unix/sysv/linux/not-cancel.h +++ b/sysdeps/unix/sysv/linux/not-cancel.h @@ -51,13 +51,16 @@ __typeof (__write) __write_nocancel; libc_hidden_proto (__write_nocancel) /* Uncancelable close. */ -#define __close_nocancel(fd) \ - INLINE_SYSCALL (close, 1, fd) -#define close_not_cancel(fd) \ - __close_nocancel (fd) -#define close_not_cancel_no_status(fd) \ - (void) ({ INTERNAL_SYSCALL_DECL (err); \ - INTERNAL_SYSCALL (close, err, 1, (fd)); }) +__typeof (__close) __close_nocancel; +libc_hidden_proto (__close_nocancel) + +/* Non cancellable close syscall that does not also set errno in case of + failure. */ +static inline void +__close_nocancel_nostatus (int fd) +{ + __close_nocancel (fd); +} /* Uncancelable writev. */ #define writev_not_cancel_no_status(fd, iov, n) \ diff --git a/sysdeps/unix/sysv/linux/pthread_getname.c b/sysdeps/unix/sysv/linux/pthread_getname.c index 93c1dfd729..d3dfee03a4 100644 --- a/sysdeps/unix/sysv/linux/pthread_getname.c +++ b/sysdeps/unix/sysv/linux/pthread_getname.c @@ -63,7 +63,7 @@ pthread_getname_np (pthread_t th, char *buf, size_t len) buf[n] = '\0'; } - close_not_cancel_no_status (fd); + __close_nocancel_nostatus (fd); return res; } diff --git a/sysdeps/unix/sysv/linux/pthread_setname.c b/sysdeps/unix/sysv/linux/pthread_setname.c index c5e9a339e8..2f68086822 100644 --- a/sysdeps/unix/sysv/linux/pthread_setname.c +++ b/sysdeps/unix/sysv/linux/pthread_setname.c @@ -57,7 +57,7 @@ pthread_setname_np (pthread_t th, const char *name) else if (n != name_len) res = EIO; - close_not_cancel_no_status (fd); + __close_nocancel_nostatus (fd); return res; } diff --git a/sysdeps/unix/sysv/linux/spawni.c b/sysdeps/unix/sysv/linux/spawni.c index 4994a07491..dea1650d08 100644 --- a/sysdeps/unix/sysv/linux/spawni.c +++ b/sysdeps/unix/sysv/linux/spawni.c @@ -205,7 +205,7 @@ __spawni_child (void *arguments) switch (action->tag) { case spawn_do_close: - if (close_not_cancel (action->action.close_action.fd) != 0) + if (__close_nocancel (action->action.close_action.fd) != 0) { if (!have_fdlimit) { @@ -228,7 +228,7 @@ __spawni_child (void *arguments) with the process already at maximum number of file descriptor opened and also for multiple actions on single-open special paths (like /dev/watchdog). */ - close_not_cancel (action->action.open_action.fd); + __close_nocancel (action->action.open_action.fd); int ret = __open_nocancel (action->action.open_action.path, action->action. @@ -247,7 +247,7 @@ __spawni_child (void *arguments) != action->action.open_action.fd) goto fail; - if (close_not_cancel (new_fd) != 0) + if (__close_nocancel (new_fd) != 0) goto fail; } } diff --git a/sysdeps/unix/sysv/linux/sysconf.c b/sysdeps/unix/sysv/linux/sysconf.c index f9becfbb33..773a6acfd4 100644 --- a/sysdeps/unix/sysv/linux/sysconf.c +++ b/sysdeps/unix/sysv/linux/sysconf.c @@ -122,7 +122,7 @@ __sysconf (int name) char buf[32]; ssize_t n; n = TEMP_FAILURE_RETRY (__read_nocancel (fd, buf, sizeof (buf) - 1)); - close_not_cancel_no_status (fd); + __close_nocancel_nostatus (fd); if (n > 0) { |