]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
pingpong: remove a malloc per Curl_pp_vsendf call
authorDaniel Stenberg <daniel@haxx.se>
Tue, 22 Sep 2020 14:26:50 +0000 (16:26 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 22 Sep 2020 21:13:26 +0000 (23:13 +0200)
This typically makes 7-9 fewer mallocs per FTP transfer.

Closes #5997

lib/pingpong.c

index 3143315219e321edbe1e6d1d5e85ea10b75b5354..1cfd0286e6644443772f32c8a48253c6d9305aec 100644 (file)
@@ -162,9 +162,10 @@ CURLcode Curl_pp_vsendf(struct pingpong *pp,
                         const char *fmt,
                         va_list args)
 {
-  ssize_t bytes_written;
+  ssize_t bytes_written = 0;
   size_t write_len;
-  char *fmt_crlf;
+  char fmt_crlf[128];
+  size_t fmtlen;
   char *s;
   CURLcode result;
   struct connectdata *conn = pp->conn;
@@ -184,16 +185,17 @@ CURLcode Curl_pp_vsendf(struct pingpong *pp,
 
   data = conn->data;
 
-  fmt_crlf = aprintf("%s\r\n", fmt); /* append a trailing CRLF */
-  if(!fmt_crlf)
-    return CURLE_OUT_OF_MEMORY;
-
-  s = vaprintf(fmt_crlf, args); /* trailing CRLF appended */
-  free(fmt_crlf);
+  fmtlen = strlen(fmt);
+  DEBUGASSERT(fmtlen < sizeof(fmt_crlf)-3);
+  if(fmtlen >= sizeof(fmt_crlf)-3)
+    return CURLE_BAD_FUNCTION_ARGUMENT;
+  memcpy(fmt_crlf, fmt, fmtlen);
+  /* append a trailing CRLF+null to the format string */
+  memcpy(&fmt_crlf[fmtlen], "\r\n", 3);
+  s = vaprintf(fmt_crlf, args);
   if(!s)
     return CURLE_OUT_OF_MEMORY;
 
-  bytes_written = 0;
   write_len = strlen(s);
 
   Curl_pp_init(pp);