2014-03-28 Richard Biener <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 28 Mar 2014 14:05:49 +0000 (14:05 +0000)
committerTom Tromey <tromey@redhat.com>
Thu, 8 May 2014 16:18:30 +0000 (10:18 -0600)
libiberty/
* simple-object.c (simple_object_internal_read): Handle
EINTR and short reads.

lto-plugin/
* lto-plugin.c (process_symtab): Handle EINTR and short reads.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@208898 138bc75d-0d04-0410-961f-82ee72b054a4

libiberty/ChangeLog
libiberty/simple-object.c

index 9dab384ccf289e58acbe56a13d07bf3c763771e1..f20fac0aabbce3487f13567783dc3a495144b670 100644 (file)
@@ -1,3 +1,8 @@
+2014-03-28  Richard Biener  <rguenther@suse.de>
+
+       * simple-object.c (simple_object_internal_read): Handle
+       EINTR and short reads.
+
 2014-03-13  Uros Bizjak  <ubizjak@gmail.com>
 
        * regex.c (bzero) [!_LIBC]: Define without coma expression.
index fde3454dd42c8df1e6ba65663ceed796850093e2..263d174051dafef741fb9627c1f0b18aeccb4ca3 100644 (file)
@@ -63,8 +63,6 @@ simple_object_internal_read (int descriptor, off_t offset,
                             unsigned char *buffer, size_t size,
                             const char **errmsg, int *err)
 {
-  ssize_t got;
-
   if (lseek (descriptor, offset, SEEK_SET) < 0)
     {
       *errmsg = "lseek";
@@ -72,15 +70,26 @@ simple_object_internal_read (int descriptor, off_t offset,
       return 0;
     }
 
-  got = read (descriptor, buffer, size);
-  if (got < 0)
+  do
     {
-      *errmsg = "read";
-      *err = errno;
-      return 0;
+      ssize_t got = read (descriptor, buffer, size);
+      if (got == 0)
+       break;
+      else if (got > 0)
+       {
+         buffer += got;
+         size -= got;
+       }
+      else if (errno != EINTR)
+       {
+         *errmsg = "read";
+         *err = errno;
+         return 0;
+       }
     }
+  while (size > 0);
 
-  if ((size_t) got < size)
+  if (size > 0)
     {
       *errmsg = "file too short";
       *err = 0;