aboutsummaryrefslogtreecommitdiff
path: root/libiberty
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2014-03-28 14:05:49 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2014-03-28 14:05:49 +0000
commit2486c24a8c2b1b603899e99c7424784de976f8d2 (patch)
tree38b79b8e6b3752931473310ae11ff056cd4f3917 /libiberty
parent44d627891f0b723466894603f5bb0cfc1eeea5c9 (diff)
downloadgcc-2486c24a8c2b1b603899e99c7424784de976f8d2.zip
gcc-2486c24a8c2b1b603899e99c7424784de976f8d2.tar.gz
gcc-2486c24a8c2b1b603899e99c7424784de976f8d2.tar.bz2
simple-object.c (simple_object_internal_read): Handle EINTR and short reads.
2014-03-28 Richard Biener <rguenther@suse.de> 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. From-SVN: r208898
Diffstat (limited to 'libiberty')
-rw-r--r--libiberty/ChangeLog5
-rw-r--r--libiberty/simple-object.c25
2 files changed, 22 insertions, 8 deletions
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog
index 9dab384..f20fac0 100644
--- a/libiberty/ChangeLog
+++ b/libiberty/ChangeLog
@@ -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.
diff --git a/libiberty/simple-object.c b/libiberty/simple-object.c
index fde3454..263d174 100644
--- a/libiberty/simple-object.c
+++ b/libiberty/simple-object.c
@@ -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;