diff options
author | Joseph Myers <joseph@codesourcery.com> | 2015-06-12 17:34:11 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2015-06-12 17:34:11 +0000 |
commit | 9714012ca015f1f6763f66bd74d6f3f9e1512b36 (patch) | |
tree | 418f7f2316fdce01a1e14b2dd19f2df91c2ea0e4 | |
parent | 498c1f6a7c7f7b634d02e740f15789cf68820a54 (diff) | |
download | glibc-9714012ca015f1f6763f66bd74d6f3f9e1512b36.tar glibc-9714012ca015f1f6763f66bd74d6f3f9e1512b36.tar.gz glibc-9714012ca015f1f6763f66bd74d6f3f9e1512b36.tar.bz2 glibc-9714012ca015f1f6763f66bd74d6f3f9e1512b36.zip |
Fix aio_* pread namespace (bug 18519).
aio_* bring in references to pread, which isn't in all the standards
containing aio_* (as a reference from one library to another, this is
a bug for dynamic as well as static linking). This patch fixes this
by using __libc_pread instead, exporting that function from libc at
symbol version GLIBC_PRIVATE; the code, with conditionals that may
call either __pread64 or __libc_pread, becomes exactly analogous to
that elsewhere in the same file that may call either __pwrite64 or
__libc_pwrite.
Tested for x86_64 and x86 (testsuite, and comparison of disassembly of
installed shared libraries). libc changes because of the PLT entry
for the newly exported __libc_pread; librt changes because of
assertion line numbers and PLT rearrangement; other stripped installed
shared libraries do not change.
[BZ #18519]
* posix/Versions (libc): Export __libc_pread at version
GLIBC_PRIVATE.
* sysdeps/pthread/aio_misc.c (handle_fildes_io): Call __libc_pread
instead of pread.
* conform/Makefile (test-xfail-POSIX/aio.h/linknamespace): Remove
variable.
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | conform/Makefile | 1 | ||||
-rw-r--r-- | posix/Versions | 2 | ||||
-rw-r--r-- | sysdeps/pthread/aio_misc.c | 9 |
5 files changed, 15 insertions, 7 deletions
@@ -1,5 +1,13 @@ 2015-06-12 Joseph Myers <joseph@codesourcery.com> + [BZ #18519] + * posix/Versions (libc): Export __libc_pread at version + GLIBC_PRIVATE. + * sysdeps/pthread/aio_misc.c (handle_fildes_io): Call __libc_pread + instead of pread. + * conform/Makefile (test-xfail-POSIX/aio.h/linknamespace): Remove + variable. + [BZ #18522] * misc/efgcvt_r.c [LONG_DOUBLE_COMPAT (libc, GLIBC_2_0) && !LONG_DOUBLE_CVT] @@ -21,7 +21,7 @@ Version 2.22 18211, 18217, 18220, 18221, 18234, 18244, 18247, 18287, 18319, 18324, 18333, 18346, 18397, 18409, 18410, 18412, 18418, 18422, 18434, 18444, 18468, 18469, 18470, 18479, 18483, 18495, 18496, 18497, 18498, 18507, - 18520, 18522. + 18519, 18520, 18522. * Cache information can be queried via sysconf() function on s390 e.g. with _SC_LEVEL1_ICACHE_SIZE as argument. diff --git a/conform/Makefile b/conform/Makefile index 09d18e2321..8c11dc41c8 100644 --- a/conform/Makefile +++ b/conform/Makefile @@ -354,7 +354,6 @@ test-xfail-XPG4/netdb.h/linknamespace = yes test-xfail-XPG4/syslog.h/linknamespace = yes test-xfail-XPG4/unistd.h/linknamespace = yes test-xfail-XPG4/wordexp.h/linknamespace = yes -test-xfail-POSIX/aio.h/linknamespace = yes test-xfail-POSIX/mqueue.h/linknamespace = yes test-xfail-POSIX/semaphore.h/linknamespace = yes test-xfail-UNIX98/fmtmsg.h/linknamespace = yes diff --git a/posix/Versions b/posix/Versions index 68df3a9f39..bb481a505b 100644 --- a/posix/Versions +++ b/posix/Versions @@ -135,6 +135,6 @@ libc { execvpe; } GLIBC_PRIVATE { - __libc_fork; __libc_pwrite; + __libc_fork; __libc_pread; __libc_pwrite; } } diff --git a/sysdeps/pthread/aio_misc.c b/sysdeps/pthread/aio_misc.c index 83a6cb951d..d9740d7ebe 100644 --- a/sysdeps/pthread/aio_misc.c +++ b/sysdeps/pthread/aio_misc.c @@ -536,10 +536,11 @@ handle_fildes_io (void *arg) aiocbp->aiocb64.aio_offset)); else aiocbp->aiocb.__return_value = - TEMP_FAILURE_RETRY (pread (fildes, - (void *) aiocbp->aiocb.aio_buf, - aiocbp->aiocb.aio_nbytes, - aiocbp->aiocb.aio_offset)); + TEMP_FAILURE_RETRY (__libc_pread (fildes, + (void *) + aiocbp->aiocb.aio_buf, + aiocbp->aiocb.aio_nbytes, + aiocbp->aiocb.aio_offset)); if (aiocbp->aiocb.__return_value == -1 && errno == ESPIPE) /* The Linux kernel is different from others. It returns |