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.gz glibc-9714012ca015f1f6763f66bd74d6f3f9e1512b36.tar.xz 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
diff --git a/ChangeLog b/ChangeLog index d9629d9c3a..3e6b877dfa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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] diff --git a/NEWS b/NEWS index b4ec2629ab..ea3d824966 100644 --- a/NEWS +++ b/NEWS @@ -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 |