]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
tool_getparam: replace malloc + copy by dynbuf for --data
authorDaniel Stenberg <daniel@haxx.se>
Mon, 8 Jan 2024 16:00:05 +0000 (17:00 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 8 Jan 2024 21:38:22 +0000 (22:38 +0100)
src/tool_getparam.c
src/tool_operate.c
src/tool_paramhlp.c
src/tool_paramhlp.h

index ddc8ff7b33781719576fd0a7432d401ae3c71a79..6a7402b168917e0a0c223908041a0800a2fca57a 100644 (file)
@@ -860,34 +860,24 @@ static ParameterError set_data(char subletter,
     config->jsoned = TRUE;
 
   if(config->postfields) {
-    /* we already have a string, we append this one with a separating
-       &-letter */
-    char *oldpost = config->postfields;
-    curl_off_t oldlen = config->postfieldsize;
-    curl_off_t newlen = oldlen + curlx_uztoso(size) + 2;
-    config->postfields = malloc((size_t)newlen);
-    if(!config->postfields) {
-      Curl_safefree(oldpost);
-      Curl_safefree(postdata);
+    /* we already have a string, append this one - perhaps with a separator */
+    struct curlx_dynbuf out;
+    curlx_dyn_init(&out, MAX_FILE2MEMORY);
+    if(curlx_dyn_addn(&out, config->postfields,
+                      (size_t)config->postfieldsize))
       err = PARAM_NO_MEM;
-      goto done;
-    }
-    memcpy(config->postfields, oldpost, (size_t)oldlen);
-    if(subletter != 'f') {
-      /* skip this treatment for --json */
-      /* use byte value 0x26 for '&' to accommodate non-ASCII platforms */
-      config->postfields[oldlen] = '\x26';
-      memcpy(&config->postfields[oldlen + 1], postdata, size);
-      config->postfields[oldlen + 1 + size] = '\0';
-      config->postfieldsize += size + 1;
-    }
-    else {
-      memcpy(&config->postfields[oldlen], postdata, size);
-      config->postfields[oldlen + size] = '\0';
-      config->postfieldsize += size;
-    }
-    Curl_safefree(oldpost);
+
+    /* skip the separator append for --json */
+    if(!err && (subletter != 'f')  && curlx_dyn_addn(&out, "&", 1))
+      err = PARAM_NO_MEM;
+
+    if(!err && curlx_dyn_addn(&out, postdata, size))
+      err = PARAM_NO_MEM;
+
+    config->postfieldsize = curlx_dyn_len(&out);
+    free(config->postfields);
     Curl_safefree(postdata);
+    config->postfields = curlx_dyn_ptr(&out);
   }
   else {
     config->postfields = postdata;
index c805b7732b25df3ed9a5176eb402866b994ec132..2b0ed8620e2e3b2c449cde6d8a4cf16bd8b21ef5 100644 (file)
@@ -372,7 +372,6 @@ void single_transfer_cleanup(struct OperationConfig *config)
       state->urls = NULL;
     }
     Curl_safefree(state->outfiles);
-    Curl_safefree(state->httpgetfields);
     Curl_safefree(state->uploadfile);
     if(state->inglob) {
       /* Free list of globbed upload files */
index a6b946edd67842164dbca05a2992ca06cf83be68..2725815000dc95db2cb9443c87a9612f2033ec1a 100644 (file)
@@ -88,8 +88,6 @@ ParameterError file2string(char **bufp, FILE *file)
   return PARAM_OK;
 }
 
-#define MAX_FILE2MEMORY (1024*1024*1024) /* big enough ? */
-
 ParameterError file2memory(char **bufp, size_t *size, FILE *file)
 {
   if(file) {
index edb87819502f407d1878d0a5721cd794afd14981..96c49ac59e8bbe801852e60d40947df04890428d 100644 (file)
@@ -30,6 +30,8 @@ struct getout *new_getout(struct OperationConfig *config);
 
 ParameterError file2string(char **bufp, FILE *file);
 
+#define MAX_FILE2MEMORY (1024*1024*1024) /* big enough ? */
+
 ParameterError file2memory(char **bufp, size_t *size, FILE *file);
 
 ParameterError str2num(long *val, const char *str);