2017-08-18 Adhemerval Zanella <adhemerval.zanella@linaro.org>
+ * sysdeps/generic/not-cancel.h (close_not_cancel): Remove macro.
+ (close_not_cancel_no_status): Likewise.
+ (__close_nocancel): New macro.
+ (__close_nocancel_nostatus): 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_nostatus): 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.
+ * sysdeps/unix/sysv/linux/Versions (libc) [GLIBC_PRIVATE]: Add
+ __close_nocancel.
+
* sysdeps/generic/not-cancel.h (openat_not_cancel): Remove macro.
(openat_not_cancel_3): Likewise.
(openat64_not_cancel_3): Likewise).
/* Release the lock again. */
close_unlock_return:
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
free (buf);
return result;
/* write basic-block execution counts: */
write_bb_counts (fd);
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
}
|| (size_t) st.st_size < sizeof (struct gconvcache_header))
{
close_and_exit:
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
return -1;
}
}
/* We don't need the file descriptor anymore. */
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
/* Check the consistency. */
header = (struct gconvcache_header *) gconv_cache;
because some ISO C functions will require linking with this object
file and the name space must not be polluted. */
# define open(name, flags) __open_nocancel (name, flags)
-# define close(fd) close_not_cancel_no_status (fd)
+# define close(fd) __close_nocancel_nostatus (fd)
# define read(fd, buf, n) __read_nocancel (fd, buf, n)
# define mmap(addr, len, prot, flags, fd, offset) \
__mmap (addr, len, prot, flags, fd, offset)
O_RDONLY | O_DIRECTORY | O_NDELAY);
dirp->stream = NULL;
if (fd != -1 && (dirp->stream = __fdopendir (fd)) == NULL)
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
}
else
{
{
int save_err = errno;
__fchdir (cwdfd);
- close_not_cancel_no_status (cwdfd);
+ __close_nocancel_nostatus (cwdfd);
__set_errno (save_err);
}
else if (cwd != NULL)
_IO_off64_t new_pos = _IO_SYSSEEK (fp, 0, _IO_seek_end);
if (new_pos == _IO_pos_BAD && errno != ESPIPE)
{
- close_not_cancel (fdesc);
+ __close_nocancel (fdesc);
return NULL;
}
}
fp->_IO_buf_base = fp->_IO_buf_end = NULL;
/* Cancelling close should be avoided if possible since it leaves an
unrecoverable state behind. */
- return close_not_cancel (fp->_fileno);
+ return __close_nocancel (fp->_fileno);
}
int
{
/* Cancelling close should be avoided if possible since it leaves an
unrecoverable state behind. */
- return close_not_cancel (fp->_fileno);
+ return __close_nocancel (fp->_fileno);
}
libc_hidden_def (_IO_file_close)
#ifndef _IO_close
#ifdef _LIBC
-#define _IO_close close_not_cancel
+#define _IO_close __close_nocancel
#else
#define _IO_close close
#endif
/* stat failed, very strange. */
close_and_out:
if (fd >= 0)
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
return NULL;
}
{
/* We've mapped the whole file already, so we can be
sure we won't need this file descriptor later. */
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
fd = -1;
}
/* We don't need the file descriptor any longer. */
if (fd >= 0)
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
fd = -1;
/* We succeeded in mapping all the necessary regions of the archive.
if (__builtin_expect (__fxstat64 (_STAT_VER, fd, &st), 0) < 0)
{
puntfd:
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
return;
}
if (__glibc_unlikely (S_ISDIR (st.st_mode)))
char *newp;
size_t filenamelen;
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
filenamelen = strlen (file->filename);
newp = (char *) alloca (filenamelen
#endif /* _POSIX_MAPPED_FILES */
/* We have mapped the data, so we no longer need the descriptor. */
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
if (__glibc_unlikely (filedata == NULL))
/* We failed to map or read the data. */
if (__lseek64 (new_fd, __lseek64 (file_fd, 0, SEEK_CUR), SEEK_SET) == -1
|| __dup2 (new_fd, file_fd) < 0)
{
- close_not_cancel_no_status (new_fd);
+ __close_nocancel_nostatus (new_fd);
return NULL;
}
- close_not_cancel_no_status (new_fd);
+ __close_nocancel_nostatus (new_fd);
file_writable = true;
}
{
assert (file_fd >= 0);
- close_not_cancel_no_status (file_fd);
+ __close_nocancel_nostatus (file_fd);
file_fd = -1;
}
UNLOCK_FILE (fd);
/* Close WTMP file. */
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
return result;
}
} else {
/* We must set an errno value since no
function call actually failed. */
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
__set_errno (ENODEV);
return -1;
}
} else {
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
return -1;
}
}
out_close:
if (sock != -1)
- close_not_cancel_no_status (sock);
+ __close_nocancel_nostatus (sock);
out:
if (__nscd_drop_map_ref (mapped, &gc_cycle) != 0)
{
out_close:
if (sock != -1)
- close_not_cancel_no_status (sock);
+ __close_nocancel_nostatus (sock);
out:
if (__nscd_drop_map_ref (mapped, &gc_cycle) != 0)
{
out_close:
if (sock != -1)
- close_not_cancel_no_status (sock);
+ __close_nocancel_nostatus (sock);
out:
if (__nscd_drop_map_ref (mapped, &gc_cycle) != 0)
{
out_close:
if (sock != -1)
- close_not_cancel_no_status (sock);
+ __close_nocancel_nostatus (sock);
out:
if (__nscd_drop_map_ref (mapped, &gc_cycle) != 0)
{
out_close:
if (sock != -1)
- close_not_cancel_no_status (sock);
+ __close_nocancel_nostatus (sock);
out:
if (__nscd_drop_map_ref (mapped, &gc_cycle) != 0)
{
}
out:
- close_not_cancel_no_status (sock);
+ __close_nocancel_nostatus (sock);
return -1;
}
return sock;
}
- close_not_cancel_no_status (sock);
+ __close_nocancel_nostatus (sock);
}
__set_errno (saved_errno);
out_close:
if (sock != -1)
- close_not_cancel_no_status (sock);
+ __close_nocancel_nostatus (sock);
out:
if (__nscd_drop_map_ref (mapped, &gc_cycle) != 0)
{
out_close:
if (sock != -1)
- close_not_cancel_no_status (sock);
+ __close_nocancel_nostatus (sock);
out:
if (__nscd_drop_map_ref (mapped, &gc_cycle) != 0)
{
out_close:
if (sock != -1)
- close_not_cancel_no_status (sock);
+ __close_nocancel_nostatus (sock);
out:
if (__nscd_drop_map_ref (mapped, &gc_cycle) != 0)
{
status = NSS_STATUS_TRYAGAIN;
}
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
}
return status;
{
if (statp->_vcsock >= 0)
{
- close_not_cancel_no_status (statp->_vcsock);
+ __close_nocancel_nostatus (statp->_vcsock);
statp->_vcsock = -1;
statp->_flags &= ~(RES_F_VC | RES_F_CONN);
}
{
if (statp->_u._ext.nssocks[ns] != -1)
{
- close_not_cancel_no_status (statp->_u._ext.nssocks[ns]);
+ __close_nocancel_nostatus (statp->_u._ext.nssocks[ns]);
statp->_u._ext.nssocks[ns] = -1;
}
if (free_addr)
}
/* We only need to close the socket here if we opened it. */
if (closeit)
- close_not_cancel (socket);
+ __close_nocancel (socket);
address->sin_port = 0;
return head;
}
__openat (__VA_ARGS__)
#define __openat64_nocancel(...) \
__openat64 (__VA_ARGS__)
-#define close_not_cancel(fd) \
+#define __close_nocancel(fd) \
__close (fd)
-#define close_not_cancel_no_status(fd) \
+#define __close_nocancel_nostatus(fd) \
(void) __close (fd)
#define __read_nocancel(fd, buf, n) \
__read (fd, buf, n)
free ((void *) dirp);
- return close_not_cancel (fd);
+ return __close_nocancel (fd);
}
weak_alias (__closedir, closedir)
{
if (fd != -1)
close_retry:
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
af = q->ai_family;
fd = __socket (af, SOCK_DGRAM | SOCK_CLOEXEC, IPPROTO_IP);
}
}
if (fd != -1)
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
/* We got all the source addresses we can get, now sort using
the information. */
# include <kernel-features.h>
#else
# define __openat64_nocancel(dfd, name, mode) openat64 (dfd, name, mode)
-# define close_not_cancel_no_status(fd) close (fd)
+# define __close_nocancel_nostatus(fd) close (fd)
#endif
#ifndef PATH_MAX
if (dirstream != NULL)
__closedir (dirstream);
if (fd_needs_closing)
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
#ifndef NO_ALLOCATION
if (buf == NULL)
free (path);
if (x >= 0)
{
- close_not_cancel_no_status (x);
+ __close_nocancel_nostatus (x);
o_directory_works = -1;
}
else if (errno != ENOTDIR)
{
__set_errno (ENOTDIR);
lose:
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
return NULL;
}
if (close_fd)
{
int save_errno = errno;
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
__set_errno (save_errno);
}
return NULL;
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 == 0)
{
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 new_fd = __open_nocancel (action->action.open_action.path,
action->action.open_action.oflag
!= action->action.open_action.fd)
goto fail;
- if (close_not_cancel (new_fd) != 0)
+ if (__close_nocancel (new_fd) != 0)
goto fail;
}
}
__syscall_rt_sigqueueinfo;
__open_nocancel;
__read_nocancel;
+ __close_nocancel;
# functions used by nscd
__netlink_assert_response;
}
while (! done);
out:
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
return;
&addr_len) == 0)
data = make_request (fd, nladdr.nl_pid);
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
}
if (data != NULL)
#include <unistd.h>
#include <sysdep-cancel.h>
+#include <not-cancel.h>
/* Close the file descriptor FD. */
int
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)
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)
{
written = __write_nocancel (fd, &id32, sizeof (id32));
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
return written != sizeof (id32) ? -1 : 0;
}
{
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;
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';
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;
}
while (l < re);
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
if (result > 0)
goto out;
else if (isdigit (l[3]))
++result;
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
}
else
{
if (fd != -1)
{
GET_NPROCS_PARSER (fd, buffer, cp, re, buffer_end, result);
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
}
}
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);
/* 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;
}
|| buf[0] != '0' || buf[1] != '\n')
newval = -1;
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
}
itc_usable = newval;
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
}
ifr.ifr_ifindex = ifindex;
status = __ioctl (fd, SIOCGIFNAME, &ifr);
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
if (status < 0)
{
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);
}
}
}
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);
}
}
if (err != 0)
{
- close_not_cancel_no_status (netlink_socket);
+ __close_nocancel_nostatus (netlink_socket);
netlink_socket = -1;
}
}
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) \
buf[n] = '\0';
}
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
return res;
}
else if (n != name_len)
res = EIO;
- close_not_cancel_no_status (fd);
+ __close_nocancel_nostatus (fd);
return res;
}
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)
{
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.
!= action->action.open_action.fd)
goto fail;
- if (close_not_cancel (new_fd) != 0)
+ if (__close_nocancel (new_fd) != 0)
goto fail;
}
}
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)
{