]> granicus.if.org Git - curl/commitdiff
check for NULL returns from strdup() - reported by Jim Meyering
authorDaniel Stenberg <daniel@haxx.se>
Fri, 14 Nov 2008 16:42:05 +0000 (16:42 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Fri, 14 Nov 2008 16:42:05 +0000 (16:42 +0000)
also prevent buffer overflow on MSDOS when you do for example -O on a url
with a file name part longer than PATH_MAX letters

src/main.c

index 6b57efce38c6f942e76428599f787d25665c20bc..f325106ecbbff6e299a6c39c8597e4bce8276454 100644 (file)
@@ -4284,11 +4284,17 @@ operate(struct Configurable *config, int argc, argv_item_t argv[])
             {
               /* This is for DOS, and then we do some major replacing of
                  bad characters in the file name before using it */
-              char file1 [PATH_MAX];
-
+              char file1[PATH_MAX];
+              if(strlen(outfile) >= PATH_MAX)
+                outfile[PATH_MAX-1]=0; /* cut it */
               strcpy(file1, msdosify(outfile));
-              free (outfile);
-              outfile = strdup (rename_if_dos_device_name(file1));
+              free(outfile);
+
+              outfile = strdup(rename_if_dos_device_name(file1));
+              if(!outfile) {
+                res = CURLE_OUT_OF_MEMORY;
+                break;
+              }
             }
 #endif /* MSDOS */
           }
@@ -5146,12 +5152,19 @@ static char *my_get_line(FILE *fp)
    do {
      if (NULL == fgets(buf, sizeof(buf), fp))
        break;
-     if (NULL == retval)
+     if (NULL == retval) {
        retval = strdup(buf);
+       if(!retval)
+         return NULL;
+     }
      else {
-       if (NULL == (retval = realloc(retval,
-                                     strlen(retval) + strlen(buf) + 1)))
-         break;
+       char *ptr;
+       ptr = realloc(retval, strlen(retval) + strlen(buf) + 1);
+       if (NULL == ptr) {
+         free(retval);
+         return NULL;
+       }
+       retval = ptr;
        strcat(retval, buf);
      }
    }