diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-03-28 14:05:49 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-03-28 14:05:49 +0000 |
commit | fa1d2c56e14dd22799ab4750552bfb9f0f7e2a19 (patch) | |
tree | 38b79b8e6b3752931473310ae11ff056cd4f3917 /lto-plugin | |
parent | b07fec47c8737e771b348087664b60e6d21ba19a (diff) | |
download | linaro-gcc-fa1d2c56e14dd22799ab4750552bfb9f0f7e2a19.tar.gz linaro-gcc-fa1d2c56e14dd22799ab4750552bfb9f0f7e2a19.tar.bz2 linaro-gcc-fa1d2c56e14dd22799ab4750552bfb9f0f7e2a19.zip |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@208898 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'lto-plugin')
-rw-r--r-- | lto-plugin/ChangeLog | 4 | ||||
-rw-r--r-- | lto-plugin/lto-plugin.c | 42 |
2 files changed, 34 insertions, 12 deletions
diff --git a/lto-plugin/ChangeLog b/lto-plugin/ChangeLog index 73688cd1cfc..8dcbc08bb5c 100644 --- a/lto-plugin/ChangeLog +++ b/lto-plugin/ChangeLog @@ -1,3 +1,7 @@ +2014-03-28 Richard Biener <rguenther@suse.de> + + * lto-plugin.c (process_symtab): Handle EINTR and short reads. + 2014-03-17 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> * configure.ac (ac_lto_plugin_ldflags): Set to -Wc,-static-libgcc diff --git a/lto-plugin/lto-plugin.c b/lto-plugin/lto-plugin.c index 6f31ed27384..1432340b015 100644 --- a/lto-plugin/lto-plugin.c +++ b/lto-plugin/lto-plugin.c @@ -39,6 +39,7 @@ along with this program; see the file COPYING3. If not see #include <stdint.h> #endif #include <assert.h> +#include <errno.h> #include <string.h> #include <stdlib.h> #include <stdio.h> @@ -817,7 +818,7 @@ process_symtab (void *data, const char *name, off_t offset, off_t length) { struct plugin_objfile *obj = (struct plugin_objfile *)data; char *s; - char *secdata; + char *secdatastart, *secdata; if (strncmp (name, LTO_SECTION_PREFIX, LTO_SECTION_PREFIX_LEN) != 0) return 1; @@ -825,23 +826,40 @@ process_symtab (void *data, const char *name, off_t offset, off_t length) s = strrchr (name, '.'); if (s) sscanf (s, ".%" PRI_LL "x", &obj->out->id); - secdata = xmalloc (length); + secdata = secdatastart = xmalloc (length); offset += obj->file->offset; - if (offset != lseek (obj->file->fd, offset, SEEK_SET) - || length != read (obj->file->fd, secdata, length)) + if (offset != lseek (obj->file->fd, offset, SEEK_SET)) + goto err; + + do { - if (message) - message (LDPL_FATAL, "%s: corrupt object file", obj->file->name); - /* Force claim_file_handler to abandon this file. */ - obj->found = 0; - free (secdata); - return 0; + ssize_t got = read (obj->file->fd, secdata, length); + if (got == 0) + break; + else if (got > 0) + { + secdata += got; + length -= got; + } + else if (errno != EINTR) + goto err; } + while (length > 0); + if (length > 0) + goto err; - translate (secdata, secdata + length, obj->out); + translate (secdatastart, secdata, obj->out); obj->found++; - free (secdata); + free (secdatastart); return 1; + +err: + if (message) + message (LDPL_FATAL, "%s: corrupt object file", obj->file->name); + /* Force claim_file_handler to abandon this file. */ + obj->found = 0; + free (secdatastart); + return 0; } /* Callback used by gold to check if the plugin will claim FILE. Writes |