mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
Consolidate non cancellable read call
This patch consolidates all the non cancellable read calls to use the __read_nocancel 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 (read_not_cancel): Remove macro. (__read_nocancel): New macro. * sysdeps/unix/sysv/linux/Versions (libc) [GLIBC_PRIVATE]: Add __read_nocancel. * sysdeps/unix/sysv/linux/not-cancel.h (__read_nocancel): Remove macro. (__read_nocancel): New prototype. * sysdeps/unix/sysv/linux/read.c (__read_nocancel): New function. * catgets/open_catalog.c (__open_catalog): Replace read_not_cancel with __read_nocancel. * intl/loadmsgcat.c (read): Likewise. * libio/fileops.c (_IO_file_read): Likewise. * locale/loadlocale.c (_nl_load_locale): Likewise. * login/utmp_file.c (getutent_r_file): Likewise. (internal_getut_r): Likewise. (getutline_r_file): Likewise. * sysdeps/unix/sysv/linux/fips-private.h (fips_enable_p): Likewise. * sysdeps/unix/sysv/linux/gethostid.c (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 (next_line): 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/libc_fatal.c (backtrace_and_maps): Likewise. * sysdeps/unix/sysv/linux/malloc-sysdep.h (check_may_shrink_heap): Likewise. * sysdeps/unix/sysv/linux/pthread_getname.c (pthread_getname_np): Likewise. * sysdeps/unix/sysv/linux/sysconf.c (__sysconf): Likewise.
This commit is contained in:
35
ChangeLog
35
ChangeLog
@ -1,3 +1,38 @@
|
|||||||
|
2017-08-18 Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||||
|
|
||||||
|
* sysdeps/generic/not-cancel.h (read_not_cancel): Remove macro.
|
||||||
|
(__read_nocancel): New macro.
|
||||||
|
* sysdeps/unix/sysv/linux/Versions (libc) [GLIBC_PRIVATE]: Add
|
||||||
|
__read_nocancel.
|
||||||
|
* sysdeps/unix/sysv/linux/not-cancel.h (__read_nocancel): Remove
|
||||||
|
macro.
|
||||||
|
(__read_nocancel): New prototype.
|
||||||
|
* sysdeps/unix/sysv/linux/read.c (__read_nocancel): New function.
|
||||||
|
* catgets/open_catalog.c (__open_catalog): Replace read_not_cancel
|
||||||
|
with __read_nocancel.
|
||||||
|
* intl/loadmsgcat.c (read): Likewise.
|
||||||
|
* libio/fileops.c (_IO_file_read): Likewise.
|
||||||
|
* locale/loadlocale.c (_nl_load_locale): Likewise.
|
||||||
|
* login/utmp_file.c (getutent_r_file): Likewise.
|
||||||
|
(internal_getut_r): Likewise.
|
||||||
|
(getutline_r_file): Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/fips-private.h (fips_enable_p): Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/gethostid.c (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 (next_line): 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/libc_fatal.c (backtrace_and_maps):
|
||||||
|
Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/malloc-sysdep.h (check_may_shrink_heap):
|
||||||
|
Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/pthread_getname.c (pthread_getname_np):
|
||||||
|
Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/sysconf.c (__sysconf): Likewise.
|
||||||
|
|
||||||
2017-08-18 H.J. Lu <hongjiu.lu@intel.com>
|
2017-08-18 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
[BZ #21966]
|
[BZ #21966]
|
||||||
|
@ -237,7 +237,7 @@ __open_catalog (const char *cat_name, const char *nlspath, const char *env_var,
|
|||||||
/* Save read, handle partial reads. */
|
/* Save read, handle partial reads. */
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
size_t now = read_not_cancel (fd, (((char *) catalog->file_ptr)
|
size_t now = __read_nocancel (fd, (((char *) catalog->file_ptr)
|
||||||
+ (st.st_size - todo)), todo);
|
+ (st.st_size - todo)), todo);
|
||||||
if (now == 0 || now == (size_t) -1)
|
if (now == 0 || now == (size_t) -1)
|
||||||
{
|
{
|
||||||
|
@ -447,7 +447,7 @@
|
|||||||
file and the name space must not be polluted. */
|
file and the name space must not be polluted. */
|
||||||
# define open(name, flags) __open_nocancel (name, flags)
|
# define open(name, flags) __open_nocancel (name, flags)
|
||||||
# define close(fd) close_not_cancel_no_status (fd)
|
# define close(fd) close_not_cancel_no_status (fd)
|
||||||
# define read(fd, buf, n) read_not_cancel (fd, buf, n)
|
# define read(fd, buf, n) __read_nocancel (fd, buf, n)
|
||||||
# define mmap(addr, len, prot, flags, fd, offset) \
|
# define mmap(addr, len, prot, flags, fd, offset) \
|
||||||
__mmap (addr, len, prot, flags, fd, offset)
|
__mmap (addr, len, prot, flags, fd, offset)
|
||||||
# define munmap(addr, len) __munmap (addr, len)
|
# define munmap(addr, len) __munmap (addr, len)
|
||||||
|
@ -1204,7 +1204,7 @@ _IO_ssize_t
|
|||||||
_IO_file_read (_IO_FILE *fp, void *buf, _IO_ssize_t size)
|
_IO_file_read (_IO_FILE *fp, void *buf, _IO_ssize_t size)
|
||||||
{
|
{
|
||||||
return (__builtin_expect (fp->_flags2 & _IO_FLAGS2_NOTCANCEL, 0)
|
return (__builtin_expect (fp->_flags2 & _IO_FLAGS2_NOTCANCEL, 0)
|
||||||
? read_not_cancel (fp->_fileno, buf, size)
|
? __read_nocancel (fp->_fileno, buf, size)
|
||||||
: read (fp->_fileno, buf, size));
|
: read (fp->_fileno, buf, size));
|
||||||
}
|
}
|
||||||
libc_hidden_def (_IO_file_read)
|
libc_hidden_def (_IO_file_read)
|
||||||
|
@ -238,7 +238,7 @@ _nl_load_locale (struct loaded_l10nfile *file, int category)
|
|||||||
char *p = (char *) filedata;
|
char *p = (char *) filedata;
|
||||||
while (to_read > 0)
|
while (to_read > 0)
|
||||||
{
|
{
|
||||||
nread = read_not_cancel (fd, p, to_read);
|
nread = __read_nocancel (fd, p, to_read);
|
||||||
if (__builtin_expect (nread, 1) <= 0)
|
if (__builtin_expect (nread, 1) <= 0)
|
||||||
{
|
{
|
||||||
free (filedata);
|
free (filedata);
|
||||||
|
@ -187,7 +187,7 @@ getutent_r_file (struct utmp *buffer, struct utmp **result)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Read the next entry. */
|
/* Read the next entry. */
|
||||||
nbytes = read_not_cancel (file_fd, &last_entry, sizeof (struct utmp));
|
nbytes = __read_nocancel (file_fd, &last_entry, sizeof (struct utmp));
|
||||||
|
|
||||||
UNLOCK_FILE (file_fd);
|
UNLOCK_FILE (file_fd);
|
||||||
|
|
||||||
@ -231,7 +231,7 @@ internal_getut_r (const struct utmp *id, struct utmp *buffer,
|
|||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
/* Read the next entry. */
|
/* Read the next entry. */
|
||||||
if (read_not_cancel (file_fd, buffer, sizeof (struct utmp))
|
if (__read_nocancel (file_fd, buffer, sizeof (struct utmp))
|
||||||
!= sizeof (struct utmp))
|
!= sizeof (struct utmp))
|
||||||
{
|
{
|
||||||
__set_errno (ESRCH);
|
__set_errno (ESRCH);
|
||||||
@ -253,7 +253,7 @@ internal_getut_r (const struct utmp *id, struct utmp *buffer,
|
|||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
/* Read the next entry. */
|
/* Read the next entry. */
|
||||||
if (read_not_cancel (file_fd, buffer, sizeof (struct utmp))
|
if (__read_nocancel (file_fd, buffer, sizeof (struct utmp))
|
||||||
!= sizeof (struct utmp))
|
!= sizeof (struct utmp))
|
||||||
{
|
{
|
||||||
__set_errno (ESRCH);
|
__set_errno (ESRCH);
|
||||||
@ -329,7 +329,7 @@ getutline_r_file (const struct utmp *line, struct utmp *buffer,
|
|||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
/* Read the next entry. */
|
/* Read the next entry. */
|
||||||
if (read_not_cancel (file_fd, &last_entry, sizeof (struct utmp))
|
if (__read_nocancel (file_fd, &last_entry, sizeof (struct utmp))
|
||||||
!= sizeof (struct utmp))
|
!= sizeof (struct utmp))
|
||||||
{
|
{
|
||||||
__set_errno (ESRCH);
|
__set_errno (ESRCH);
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
__close (fd)
|
__close (fd)
|
||||||
#define close_not_cancel_no_status(fd) \
|
#define close_not_cancel_no_status(fd) \
|
||||||
(void) __close (fd)
|
(void) __close (fd)
|
||||||
#define read_not_cancel(fd, buf, n) \
|
#define __read_nocancel(fd, buf, n) \
|
||||||
__read (fd, buf, n)
|
__read (fd, buf, n)
|
||||||
#define write_not_cancel(fd, buf, n) \
|
#define write_not_cancel(fd, buf, n) \
|
||||||
__write (fd, buf, n)
|
__write (fd, buf, n)
|
||||||
|
@ -170,6 +170,7 @@ libc {
|
|||||||
# functions used in other libraries
|
# functions used in other libraries
|
||||||
__syscall_rt_sigqueueinfo;
|
__syscall_rt_sigqueueinfo;
|
||||||
__open_nocancel;
|
__open_nocancel;
|
||||||
|
__read_nocancel;
|
||||||
# functions used by nscd
|
# functions used by nscd
|
||||||
__netlink_assert_response;
|
__netlink_assert_response;
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,7 @@ fips_enabled_p (void)
|
|||||||
/* This is more than enough, the file contains a single integer. */
|
/* This is more than enough, the file contains a single integer. */
|
||||||
char buf[32];
|
char buf[32];
|
||||||
ssize_t n;
|
ssize_t n;
|
||||||
n = TEMP_FAILURE_RETRY (read_not_cancel (fd, buf, sizeof (buf) - 1));
|
n = TEMP_FAILURE_RETRY (__read_nocancel (fd, buf, sizeof (buf) - 1));
|
||||||
close_not_cancel_no_status (fd);
|
close_not_cancel_no_status (fd);
|
||||||
|
|
||||||
if (n > 0)
|
if (n > 0)
|
||||||
|
@ -80,7 +80,7 @@ gethostid (void)
|
|||||||
fd = __open_nocancel (HOSTIDFILE, O_RDONLY|O_LARGEFILE, 0);
|
fd = __open_nocancel (HOSTIDFILE, O_RDONLY|O_LARGEFILE, 0);
|
||||||
if (fd >= 0)
|
if (fd >= 0)
|
||||||
{
|
{
|
||||||
ssize_t n = read_not_cancel (fd, &id, sizeof (id));
|
ssize_t n = __read_nocancel (fd, &id, sizeof (id));
|
||||||
|
|
||||||
close_not_cancel_no_status (fd);
|
close_not_cancel_no_status (fd);
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@ getloadavg (double loadavg[], int nelem)
|
|||||||
ssize_t nread;
|
ssize_t nread;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
nread = read_not_cancel (fd, buf, sizeof buf - 1);
|
nread = __read_nocancel (fd, buf, sizeof buf - 1);
|
||||||
close_not_cancel_no_status (fd);
|
close_not_cancel_no_status (fd);
|
||||||
if (nread <= 0)
|
if (nread <= 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -41,7 +41,7 @@ __getlogin_r_loginuid (char *name, size_t namesize)
|
|||||||
/* We are reading a 32-bit number. 12 bytes are enough for the text
|
/* We are reading a 32-bit number. 12 bytes are enough for the text
|
||||||
representation. If not, something is wrong. */
|
representation. If not, something is wrong. */
|
||||||
char uidbuf[12];
|
char uidbuf[12];
|
||||||
ssize_t n = TEMP_FAILURE_RETRY (read_not_cancel (fd, uidbuf,
|
ssize_t n = TEMP_FAILURE_RETRY (__read_nocancel (fd, uidbuf,
|
||||||
sizeof (uidbuf)));
|
sizeof (uidbuf)));
|
||||||
close_not_cancel_no_status (fd);
|
close_not_cancel_no_status (fd);
|
||||||
|
|
||||||
|
@ -85,7 +85,7 @@ next_line (int fd, char *const buffer, char **cp, char **re,
|
|||||||
*re = buffer + (*re - *cp);
|
*re = buffer + (*re - *cp);
|
||||||
*cp = buffer;
|
*cp = buffer;
|
||||||
|
|
||||||
ssize_t n = read_not_cancel (fd, *re, buffer_end - *re);
|
ssize_t n = __read_nocancel (fd, *re, buffer_end - *re);
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@ -96,7 +96,7 @@ next_line (int fd, char *const buffer, char **cp, char **re,
|
|||||||
{
|
{
|
||||||
/* Truncate too long lines. */
|
/* Truncate too long lines. */
|
||||||
*re = buffer + 3 * (buffer_end - buffer) / 4;
|
*re = buffer + 3 * (buffer_end - buffer) / 4;
|
||||||
n = read_not_cancel (fd, *re, buffer_end - *re);
|
n = __read_nocancel (fd, *re, buffer_end - *re);
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ is_smp_system (void)
|
|||||||
/* This was not successful. Now try reading the /proc filesystem. */
|
/* This was not successful. Now try reading the /proc filesystem. */
|
||||||
int fd = __open_nocancel ("/proc/sys/kernel/version", O_RDONLY);
|
int fd = __open_nocancel ("/proc/sys/kernel/version", O_RDONLY);
|
||||||
if (__builtin_expect (fd, 0) == -1
|
if (__builtin_expect (fd, 0) == -1
|
||||||
|| read_not_cancel (fd, u.buf, sizeof (u.buf)) <= 0)
|
|| __read_nocancel (fd, u.buf, sizeof (u.buf)) <= 0)
|
||||||
/* This also didn't work. We give up and say it's a UP machine. */
|
/* This also didn't work. We give up and say it's a UP machine. */
|
||||||
u.buf[0] = '\0';
|
u.buf[0] = '\0';
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ has_cpuclock (void)
|
|||||||
/* We expect the file to contain a single digit followed by
|
/* We expect the file to contain a single digit followed by
|
||||||
a newline. If the format changes we better not rely on
|
a newline. If the format changes we better not rely on
|
||||||
the file content. */
|
the file content. */
|
||||||
if (read_not_cancel (fd, buf, sizeof buf) != 2
|
if (__read_nocancel (fd, buf, sizeof buf) != 2
|
||||||
|| buf[0] != '0' || buf[1] != '\n')
|
|| buf[0] != '0' || buf[1] != '\n')
|
||||||
newval = -1;
|
newval = -1;
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ backtrace_and_maps (int do_abort, bool written, int fd)
|
|||||||
int fd2 = __open_nocancel ("/proc/self/maps", O_RDONLY);
|
int fd2 = __open_nocancel ("/proc/self/maps", O_RDONLY);
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
ssize_t n2;
|
ssize_t n2;
|
||||||
while ((n2 = read_not_cancel (fd2, buf, sizeof (buf))) > 0)
|
while ((n2 = __read_nocancel (fd2, buf, sizeof (buf))) > 0)
|
||||||
if (write_not_cancel (fd, buf, n2) != n2)
|
if (write_not_cancel (fd, buf, n2) != n2)
|
||||||
break;
|
break;
|
||||||
close_not_cancel_no_status (fd2);
|
close_not_cancel_no_status (fd2);
|
||||||
|
@ -47,7 +47,7 @@ check_may_shrink_heap (void)
|
|||||||
if (fd >= 0)
|
if (fd >= 0)
|
||||||
{
|
{
|
||||||
char val;
|
char val;
|
||||||
ssize_t n = read_not_cancel (fd, &val, 1);
|
ssize_t n = __read_nocancel (fd, &val, 1);
|
||||||
may_shrink_heap = n > 0 && val == '2';
|
may_shrink_heap = n > 0 && val == '2';
|
||||||
close_not_cancel_no_status (fd);
|
close_not_cancel_no_status (fd);
|
||||||
}
|
}
|
||||||
|
@ -34,9 +34,9 @@ libc_hidden_proto (__open_nocancel)
|
|||||||
__typeof (open64) __open64_nocancel;
|
__typeof (open64) __open64_nocancel;
|
||||||
libc_hidden_proto (__open64_nocancel)
|
libc_hidden_proto (__open64_nocancel)
|
||||||
|
|
||||||
/* Uncancelable read. */
|
/* Non cancellable read syscall. */
|
||||||
#define __read_nocancel(fd, buf, len) \
|
__typeof (__read) __read_nocancel;
|
||||||
INLINE_SYSCALL (read, 3, fd, buf, len)
|
libc_hidden_proto (__read_nocancel)
|
||||||
|
|
||||||
/* Uncancelable write. */
|
/* Uncancelable write. */
|
||||||
#define __write_nocancel(fd, buf, len) \
|
#define __write_nocancel(fd, buf, len) \
|
||||||
@ -61,10 +61,6 @@ libc_hidden_proto (__open64_nocancel)
|
|||||||
(void) ({ INTERNAL_SYSCALL_DECL (err); \
|
(void) ({ INTERNAL_SYSCALL_DECL (err); \
|
||||||
INTERNAL_SYSCALL (close, err, 1, (fd)); })
|
INTERNAL_SYSCALL (close, err, 1, (fd)); })
|
||||||
|
|
||||||
/* Uncancelable read. */
|
|
||||||
#define read_not_cancel(fd, buf, n) \
|
|
||||||
__read_nocancel (fd, buf, n)
|
|
||||||
|
|
||||||
/* Uncancelable write. */
|
/* Uncancelable write. */
|
||||||
#define write_not_cancel(fd, buf, n) \
|
#define write_not_cancel(fd, buf, n) \
|
||||||
__write_nocancel (fd, buf, n)
|
__write_nocancel (fd, buf, n)
|
||||||
|
@ -50,7 +50,7 @@ pthread_getname_np (pthread_t th, char *buf, size_t len)
|
|||||||
return errno;
|
return errno;
|
||||||
|
|
||||||
int res = 0;
|
int res = 0;
|
||||||
ssize_t n = TEMP_FAILURE_RETRY (read_not_cancel (fd, buf, len));
|
ssize_t n = TEMP_FAILURE_RETRY (__read_nocancel (fd, buf, len));
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
res = errno;
|
res = errno;
|
||||||
else
|
else
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sysdep-cancel.h>
|
#include <sysdep-cancel.h>
|
||||||
|
#include <not-cancel.h>
|
||||||
|
|
||||||
/* Read NBYTES into BUF from FD. Return the number read or -1. */
|
/* Read NBYTES into BUF from FD. Return the number read or -1. */
|
||||||
ssize_t
|
ssize_t
|
||||||
@ -31,3 +32,14 @@ libc_hidden_def (__read)
|
|||||||
weak_alias (__libc_read, __read)
|
weak_alias (__libc_read, __read)
|
||||||
libc_hidden_def (read)
|
libc_hidden_def (read)
|
||||||
weak_alias (__libc_read, read)
|
weak_alias (__libc_read, read)
|
||||||
|
|
||||||
|
#if !IS_IN (rtld)
|
||||||
|
ssize_t
|
||||||
|
__read_nocancel (int fd, void *buf, size_t nbytes)
|
||||||
|
{
|
||||||
|
return INLINE_SYSCALL_CALL (read, fd, buf, nbytes);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
strong_alias (__libc_read, __read_nocancel)
|
||||||
|
#endif
|
||||||
|
libc_hidden_def (__read_nocancel)
|
||||||
|
@ -121,7 +121,7 @@ __sysconf (int name)
|
|||||||
/* This is more than enough, the file contains a single integer. */
|
/* This is more than enough, the file contains a single integer. */
|
||||||
char buf[32];
|
char buf[32];
|
||||||
ssize_t n;
|
ssize_t n;
|
||||||
n = TEMP_FAILURE_RETRY (read_not_cancel (fd, buf, sizeof (buf) - 1));
|
n = TEMP_FAILURE_RETRY (__read_nocancel (fd, buf, sizeof (buf) - 1));
|
||||||
close_not_cancel_no_status (fd);
|
close_not_cancel_no_status (fd);
|
||||||
|
|
||||||
if (n > 0)
|
if (n > 0)
|
||||||
|
Reference in New Issue
Block a user