summaryrefslogtreecommitdiff
path: root/libiberty/argv.c
diff options
context:
space:
mode:
authorCarlos O'Donell <carlos@codesourcery.com>2006-01-20 22:55:36 +0000
committerCarlos O'Donell <carlos@gcc.gnu.org>2006-01-20 22:55:36 +0000
commit974c2c56f4aa3ae4458f6f46fc8fa5f4de8d476b (patch)
tree89df8fbace1ce500a3df6352ee2b545773439551 /libiberty/argv.c
parentac2b2479e8981d12f760ff6e13e9aa38dc70b36d (diff)
Makefile.in: Add test-expandargv test.
libiberty/ 2006-01-20 Carlos O'Donell <carlos@codesourcery.com> * testsuite/Makefile.in: Add test-expandargv test. * testsuite/test-expandargv.c: New test. * argv.c (expandargv): Check for errors with ferror, rather than just by looking at return value from fread. From-SVN: r110047
Diffstat (limited to 'libiberty/argv.c')
-rw-r--r--libiberty/argv.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/libiberty/argv.c b/libiberty/argv.c
index 79241b6dce7..11ca549a8ea 100644
--- a/libiberty/argv.c
+++ b/libiberty/argv.c
@@ -328,8 +328,12 @@ expandargv (argcp, argvp)
const char *filename;
/* The response file. */
FILE *f;
- /* The number of characters in the response file. */
+ /* An upper bound on the number of characters in the response
+ file. */
long pos;
+ /* The number of characters in the response file, when actually
+ read. */
+ size_t len;
/* A dynamically allocated buffer used to hold options read from a
response file. */
char *buffer;
@@ -337,7 +341,7 @@ expandargv (argcp, argvp)
response file. */
char **file_argv;
/* The number of options read from the response file, if any. */
- size_t file_argc;
+ size_t file_argc;
/* We are only interested in options of the form "@file". */
filename = (*argvp)[i];
if (filename[0] != '@')
@@ -354,10 +358,15 @@ expandargv (argcp, argvp)
if (fseek (f, 0L, SEEK_SET) == -1)
goto error;
buffer = (char *) xmalloc (pos * sizeof (char) + 1);
- if (fread (buffer, sizeof (char), pos, f) != (size_t) pos)
+ len = fread (buffer, sizeof (char), pos, f);
+ if (len != (size_t) pos
+ /* On Windows, fread may return a value smaller than POS,
+ due to CR/LF->CR translation when reading text files.
+ That does not in-and-of itself indicate failure. */
+ && ferror (f))
goto error;
/* Add a NUL terminator. */
- buffer[pos] = '\0';
+ buffer[len] = '\0';
/* Parse the string. */
file_argv = buildargv (buffer);
/* If *ARGVP is not already dynamically allocated, copy it. */