OSDN Git Service

2006-03-08 Paolo Bonzini <bonzini@gnu.org>
[pf3gnuchains/gcc-fork.git] / libiberty / argv.c
index 71f164a..11ca549 100644 (file)
@@ -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.  */
@@ -365,9 +374,10 @@ expandargv (argcp, argvp)
        {
          *argvp = dupargv (*argvp);
          if (!*argvp)
-           /* We do not know exactly many bytes dupargv tried to
-              allocate, so make a guess.  */
-           xmalloc_failed (*argcp * 32);
+           {
+             fputs ("\nout of memory\n", stderr);
+             xexit (1);
+           }
        }
       /* Count the number of arguments.  */
       file_argc = 0;