about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSiddhesh Poyarekar <siddhesh@redhat.com>2012-10-20 08:00:58 +0530
committerSiddhesh Poyarekar <siddhesh@redhat.com>2012-10-20 08:03:54 +0530
commit88481c163885767a6617823314802aa772271804 (patch)
treee8fe6cc0c520703aefabe5238f5278776c75e2bc
parent89f1c38881d566bb731711632ac84ee1e3d883ee (diff)
downloadglibc-88481c163885767a6617823314802aa772271804.tar.gz
glibc-88481c163885767a6617823314802aa772271804.tar.xz
glibc-88481c163885767a6617823314802aa772271804.zip
Retry read in ld.so if the entire ELF header is not read in
[BZ #13601]

A read operation could return less than requested data for a number of
reasons.
-rw-r--r--ChangeLog6
-rw-r--r--NEWS14
-rw-r--r--elf/dl-load.c14
3 files changed, 25 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index e5d8bbaa6a..eb60959bec 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2012-10-20  Siddhesh Poyarekar  <siddhesh@redhat.com>
+
+	[BZ #13601]
+	* elf/dl-load.c (open_verify): Retry read if the entire ELF
+	header is not read in.
+
 2012-10-19  Joseph Myers  <joseph@codesourcery.com>
 
 	* io/Makefile ($(objpfx)ftwtest.out): Depend on ftwtest-sh.  Pass
diff --git a/NEWS b/NEWS
index aa40b75021..fd3f6e52da 100644
--- a/NEWS
+++ b/NEWS
@@ -10,13 +10,13 @@ Version 2.17
 * The following bugs are resolved with this release:
 
   1349, 3479, 5044, 5298, 5400, 6530, 6778, 6808, 9685, 9914, 10014, 10038,
-  10631, 11438, 11607, 12140, 13412, 13542, 13629, 13679, 13696, 13717,
-  13741, 13939, 13966, 14042, 14090, 14150, 14151, 14154, 14157, 14166,
-  14173, 14195, 14237, 14251, 14252, 14283, 14298, 14303, 14307, 14328,
-  14331, 14336, 14337, 14347, 14349, 14376, 14417, 14459, 14476, 14477,
-  14505, 14510, 14516, 14518, 14519, 14530, 14532, 14538, 14543, 14544,
-  14545, 14557, 14562, 14568, 14576, 14579, 14583, 14587, 14602, 14621,
-  14638, 14645, 14648, 14652, 14660, 14661, 14694, 14716.
+  10631, 11438, 11607, 12140, 13412, 13542, 13601, 13629, 13679, 13696,
+  13717, 13741, 13939, 13966, 14042, 14090, 14150, 14151, 14154, 14157,
+  14166, 14173, 14195, 14237, 14251, 14252, 14283, 14298, 14303, 14307,
+  14328, 14331, 14336, 14337, 14347, 14349, 14376, 14417, 14459, 14476,
+  14477, 14505, 14510, 14516, 14518, 14519, 14530, 14532, 14538, 14543,
+  14544, 14545, 14557, 14562, 14568, 14576, 14579, 14583, 14587, 14602,
+  14621, 14638, 14645, 14648, 14652, 14660, 14661, 14694, 14716.
 
 * Support for STT_GNU_IFUNC symbols added for s390 and s390x.
   Optimized versions of memcpy, memset, and memcmp added for System z10 and
diff --git a/elf/dl-load.c b/elf/dl-load.c
index 0bfa74a25e..4b57879b9d 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -1722,10 +1722,20 @@ open_verify (const char *name, struct filebuf *fbp, struct link_map *loader,
       /* We successfully openened the file.  Now verify it is a file
 	 we can use.  */
       __set_errno (0);
-      fbp->len = __libc_read (fd, fbp->buf, sizeof (fbp->buf));
+      fbp->len = 0;
+      assert (sizeof (fbp->buf) > sizeof (ElfW(Ehdr)));
+      /* Read in the header.  */
+      do
+        {
+          ssize_t retlen = __libc_read (fd, fbp->buf + fbp->len,
+					sizeof (fbp->buf) - fbp->len);
+	  if (retlen <= 0)
+	    break;
+	  fbp->len += retlen;
+	}
+      while (__builtin_expect (fbp->len < sizeof (ElfW(Ehdr)), 0));
 
       /* This is where the ELF header is loaded.  */
-      assert (sizeof (fbp->buf) > sizeof (ElfW(Ehdr)));
       ehdr = (ElfW(Ehdr) *) fbp->buf;
 
       /* Now run the tests.  */