Fix aio_* pread namespace (bug 18519).
authorJoseph Myers <joseph@codesourcery.com>
Fri, 12 Jun 2015 17:34:11 +0000 (17:34 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Fri, 12 Jun 2015 17:34:11 +0000 (17:34 +0000)
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.

ChangeLog
NEWS
conform/Makefile
posix/Versions
sysdeps/pthread/aio_misc.c

index d9629d9..3e6b877 100644 (file)
--- 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 b4ec262..ea3d824 100644 (file)
--- 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.
index 09d18e2..8c11dc4 100644 (file)
@@ -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
index 68df3a9..bb481a5 100644 (file)
@@ -135,6 +135,6 @@ libc {
     execvpe;
   }
   GLIBC_PRIVATE {
-    __libc_fork; __libc_pwrite;
+    __libc_fork; __libc_pread; __libc_pwrite;
   }
 }
index 83a6cb9..d9740d7 100644 (file)
@@ -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