]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
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 d9629d9c3ad2b4f46b8c66c1e1ffc3439669ea6b..3e6b877dfa7c555081244a1f621eee4853ab8b7c 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 b4ec2629abba969d740097efb005e292f1ccfae5..ea3d8249666de5e8553aa7c47725c20f3e1f712b 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 09d18e2321d6dcf6c98c32af6e6d0ca1295f0d43..8c11dc41c8e30e9f653da4d1001e867500aa73c5 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 68df3a9f390bf01e08570ef3ed257c127ebad8ad..bb481a505b734c0d699a6f3f71b18d40f185ef8e 100644 (file)
@@ -135,6 +135,6 @@ libc {
     execvpe;
   }
   GLIBC_PRIVATE {
-    __libc_fork; __libc_pwrite;
+    __libc_fork; __libc_pread; __libc_pwrite;
   }
 }
index 83a6cb951d9a8ca640f66ca40ca54d725d79d847..d9740d7ebe28f01560084c41dcfac89027425490 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