]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
curl: make file2string use dynbuf
authorDaniel Stenberg <daniel@haxx.se>
Fri, 11 Sep 2020 08:49:24 +0000 (10:49 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 14 Sep 2020 10:33:48 +0000 (12:33 +0200)
Closes #5952

src/tool_paramhlp.c

index e57daa2e12e4c4c696f3bc3e08f875afbb8fa47a..f60d4f957982572c23be7356b63a8a531f58377c 100644 (file)
@@ -34,6 +34,7 @@
 #include "tool_msgs.h"
 #include "tool_paramhlp.h"
 #include "tool_version.h"
+#include "dynbuf.h"
 
 #include "memdebug.h" /* keep this as LAST include */
 
@@ -56,51 +57,27 @@ struct getout *new_getout(struct OperationConfig *config)
   return node;
 }
 
+#define MAX_FILE2STRING (256*1024*1024) /* big enough ? */
+
 ParameterError file2string(char **bufp, FILE *file)
 {
-  char *string = NULL;
+  struct curlx_dynbuf dyn;
+  curlx_dyn_init(&dyn, MAX_FILE2STRING);
   if(file) {
-    char *ptr;
-    size_t alloc = 512;
-    size_t alloc_needed;
     char buffer[256];
-    size_t stringlen = 0;
-    string = calloc(1, alloc);
-    if(!string)
-      return PARAM_NO_MEM;
 
     while(fgets(buffer, sizeof(buffer), file)) {
-      size_t buflen;
-      ptr = strchr(buffer, '\r');
+      char *ptr = strchr(buffer, '\r');
       if(ptr)
         *ptr = '\0';
       ptr = strchr(buffer, '\n');
       if(ptr)
         *ptr = '\0';
-      buflen = strlen(buffer);
-      alloc_needed = stringlen + buflen + 1;
-      if(alloc < alloc_needed) {
-#if SIZEOF_SIZE_T < 8
-        if(alloc >= (size_t)SIZE_T_MAX/2) {
-          Curl_safefree(string);
-          return PARAM_NO_MEM;
-        }
-#endif
-        /* doubling is enough since the string to add is always max 256 bytes
-           and the alloc size start at 512 */
-        alloc *= 2;
-        ptr = realloc(string, alloc);
-        if(!ptr) {
-          Curl_safefree(string);
-          return PARAM_NO_MEM;
-        }
-        string = ptr;
-      }
-      strcpy(string + stringlen, buffer);
-      stringlen += buflen;
+      if(curlx_dyn_add(&dyn, buffer))
+        return PARAM_NO_MEM;
     }
   }
-  *bufp = string;
+  *bufp = curlx_dyn_ptr(&dyn);
   return PARAM_OK;
 }