diff options
author | Carlos O'Donell <carlos@codesourcery.com> | 2006-01-20 22:55:36 +0000 |
---|---|---|
committer | Carlos O'Donell <carlos@gcc.gnu.org> | 2006-01-20 22:55:36 +0000 |
commit | 974c2c56f4aa3ae4458f6f46fc8fa5f4de8d476b (patch) | |
tree | 89df8fbace1ce500a3df6352ee2b545773439551 /libiberty/argv.c | |
parent | ac2b2479e8981d12f760ff6e13e9aa38dc70b36d (diff) | |
download | gcc-974c2c56f4aa3ae4458f6f46fc8fa5f4de8d476b.zip gcc-974c2c56f4aa3ae4458f6f46fc8fa5f4de8d476b.tar.gz gcc-974c2c56f4aa3ae4458f6f46fc8fa5f4de8d476b.tar.bz2 |
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.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/libiberty/argv.c b/libiberty/argv.c index 79241b6..11ca549 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. */ |