]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
ccsidcurl: make curl_mime_data_ccsid() use the converted size
authorDaniel Stenberg <daniel@haxx.se>
Tue, 11 Nov 2025 14:53:07 +0000 (15:53 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 11 Nov 2025 16:36:13 +0000 (17:36 +0100)
dynconvert() now offers to return the size of the converted data as it
might be different that the provided input size.

Bonus: minor indent fixing of some closing braces.

Reported-by: Stanislav Fort (Aisle Research)
Closes #19465

packages/OS400/ccsidcurl.c

index 9fd11a4cf9bac4cf5bf9367bb664f1bc4f037529..30be1f60f71e0cb0a21e9fcdf0bb5eca7d41ebf8 100644 (file)
@@ -134,16 +134,16 @@ convert(char *d, size_t dlen, int dccsid,
       memcpy(d, s, i);
 
     return i;
-    }
+  }
 
   if(slen < 0) {
     lslen = 0;
     cd = iconv_open_CCSID(dccsid, sccsid, 1);
-    }
+  }
   else {
     lslen = (size_t) slen;
     cd = iconv_open_CCSID(dccsid, sccsid, 0);
-    }
+  }
 
   if(ICONV_OPEN_ERROR(cd))
     return -1;
@@ -160,7 +160,8 @@ convert(char *d, size_t dlen, int dccsid,
 }
 
 
-static char *dynconvert(int dccsid, const char *s, int slen, int sccsid)
+static char *dynconvert(int dccsid, const char *s, int slen, int sccsid,
+                        int *olen)
 {
   char *d;
   char *cp;
@@ -182,7 +183,7 @@ static char *dynconvert(int dccsid, const char *s, int slen, int sccsid)
   if(l < 0) {
     free(d);
     return (char *) NULL;
-    }
+  }
 
   if(slen < 0) {
     /* Need to null-terminate even when source length is given.
@@ -194,17 +195,19 @@ static char *dynconvert(int dccsid, const char *s, int slen, int sccsid)
     if(l2 < 0) {
       free(d);
       return (char *) NULL;
-      }
+    }
 
     l += l2;
-    }
+  }
 
   if((size_t) l < dlen) {
     cp = realloc(d, l);         /* Shorten to minimum needed. */
 
     if(cp)
       d = cp;
-    }
+  }
+  if(olen)
+    *olen = l;
 
   return d;
 }
@@ -217,7 +220,7 @@ slist_convert(int dccsid, struct curl_slist *from, int sccsid)
 
   for(; from; from = from->next) {
     struct curl_slist *nl;
-    char *cp = dynconvert(dccsid, from->data, -1, sccsid);
+    char *cp = dynconvert(dccsid, from->data, -1, sccsid, NULL);
 
     if(!cp) {
       curl_slist_free_all(to);
@@ -261,7 +264,7 @@ const char *
 curl_to_ccsid(const char *s, unsigned int ccsid)
 {
   if(s)
-    s = dynconvert(ccsid, s, -1, ASCII_CCSID);
+    s = dynconvert(ccsid, s, -1, ASCII_CCSID, NULL);
   return s;
 }
 
@@ -270,7 +273,7 @@ const char *
 curl_from_ccsid(const char *s, unsigned int ccsid)
 {
   if(s)
-    s = dynconvert(ASCII_CCSID, s, -1, ccsid);
+    s = dynconvert(ASCII_CCSID, s, -1, ccsid, NULL);
   return s;
 }
 
@@ -295,7 +298,7 @@ curl_easy_escape_ccsid(CURL *handle, const char *string, int length,
     return (char *) NULL;
     }
 
-  s = dynconvert(ASCII_CCSID, string, length ? length : -1, sccsid);
+  s = dynconvert(ASCII_CCSID, string, length ? length : -1, sccsid, NULL);
 
   if(!s)
     return (char *) NULL;
@@ -306,7 +309,7 @@ curl_easy_escape_ccsid(CURL *handle, const char *string, int length,
   if(!d)
     return (char *) NULL;
 
-  s = dynconvert(dccsid, d, -1, ASCII_CCSID);
+  s = dynconvert(dccsid, d, -1, ASCII_CCSID, NULL);
   free(d);
   return s;
 }
@@ -326,7 +329,7 @@ curl_easy_unescape_ccsid(CURL *handle, const char *string, int length,
     return (char *) NULL;
     }
 
-  s = dynconvert(ASCII_CCSID, string, length ? length : -1, sccsid);
+  s = dynconvert(ASCII_CCSID, string, length ? length : -1, sccsid, NULL);
 
   if(!s)
     return (char *) NULL;
@@ -337,7 +340,7 @@ curl_easy_unescape_ccsid(CURL *handle, const char *string, int length,
   if(!d)
     return (char *) NULL;
 
-  s = dynconvert(dccsid, d, -1, ASCII_CCSID);
+  s = dynconvert(dccsid, d, -1, ASCII_CCSID, NULL);
   free(d);
 
   if(s && outlength)
@@ -378,7 +381,7 @@ curl_getdate_ccsid(const char *p, const time_t *unused, unsigned int ccsid)
   if(!p)
     return curl_getdate(p, unused);
 
-  s = dynconvert(ASCII_CCSID, p, -1, ccsid);
+  s = dynconvert(ASCII_CCSID, p, -1, ccsid, NULL);
 
   if(!s)
     return (time_t) -1;
@@ -407,7 +410,7 @@ convert_version_info_string(const char **stringp,
     *stringp = *bufp;
     *bufp += l;
     *left -= l;
-    }
+  }
 
   return 0;
 }
@@ -471,7 +474,7 @@ curl_version_info_ccsid(CURLversion stamp, unsigned int ccsid)
       n += strlen(p->protocols[nproto++]);
 
     n += nproto++;
-    }
+  }
 
   for(i = 0; i < sizeof(charfields) / sizeof(charfields[0]); i++) {
     cpp = (const char **) ((char *) p + charfields[i]);
@@ -596,7 +599,7 @@ curl_easy_getinfo_ccsid(CURL *curl, CURLINFO info, ...)
       cpp = (char * *) paramp;
 
       if(*cpp) {
-        *cpp = dynconvert(ccsid, *cpp, -1, ASCII_CCSID);
+        *cpp = dynconvert(ccsid, *cpp, -1, ASCII_CCSID, NULL);
 
         if(!*cpp)
           ret = CURLE_OUT_OF_MEMORY;
@@ -1180,7 +1183,7 @@ curl_easy_setopt_ccsid(CURL *easy, CURLoption tag, ...)
     ccsid = va_arg(arg, unsigned int);
 
     if(s) {
-      s = dynconvert(ASCII_CCSID, s, -1, ccsid);
+      s = dynconvert(ASCII_CCSID, s, -1, ccsid, NULL);
 
       if(!s) {
         result = CURLE_OUT_OF_MEMORY;
@@ -1208,7 +1211,7 @@ curl_easy_setopt_ccsid(CURL *easy, CURLoption tag, ...)
 
     if(pfsize == -1) {
       /* Data is null-terminated. */
-      s = dynconvert(ASCII_CCSID, s, -1, ccsid);
+      s = dynconvert(ASCII_CCSID, s, -1, ccsid, NULL);
 
       if(!s) {
         result = CURLE_OUT_OF_MEMORY;
@@ -1343,7 +1346,7 @@ curl_pushheader_bynum_cssid(struct curl_pushheaders *h,
   char *s = curl_pushheader_bynum(h, num);
 
   if(s)
-    d = dynconvert(ccsid, s, -1, ASCII_CCSID);
+    d = dynconvert(ccsid, s, -1, ASCII_CCSID, NULL);
 
   return d;
 }
@@ -1356,14 +1359,14 @@ curl_pushheader_byname_ccsid(struct curl_pushheaders *h, const char *header,
   char *d = (char *) NULL;
 
   if(header) {
-    header = dynconvert(ASCII_CCSID, header, -1, ccsidin);
+    header = dynconvert(ASCII_CCSID, header, -1, ccsidin, NULL);
 
     if(header) {
       char *s = curl_pushheader_byname(h, header);
       free((char *) header);
 
       if(s)
-        d = dynconvert(ccsidout, s, -1, ASCII_CCSID);
+        d = dynconvert(ccsidout, s, -1, ASCII_CCSID, NULL);
     }
   }
 
@@ -1379,7 +1382,7 @@ mime_string_call(curl_mimepart *part, const char *string, unsigned int ccsid,
 
   if(!string)
     return mimefunc(part, string);
-  s = dynconvert(ASCII_CCSID, string, -1, ccsid);
+  s = dynconvert(ASCII_CCSID, string, -1, ccsid, NULL);
   if(!s)
     return CURLE_OUT_OF_MEMORY;
 
@@ -1428,14 +1431,15 @@ curl_mime_data_ccsid(curl_mimepart *part,
 {
   char *s = (char *) NULL;
   CURLcode result;
+  int osize;
 
   if(!data)
     return curl_mime_data(part, data, datasize);
-  s = dynconvert(ASCII_CCSID, data, datasize, ccsid);
+  s = dynconvert(ASCII_CCSID, data, datasize, ccsid, &osize);
   if(!s)
     return CURLE_OUT_OF_MEMORY;
 
-  result = curl_mime_data(part, s, datasize);
+  result = curl_mime_data(part, s, osize);
   free(s);
   return result;
 }
@@ -1454,7 +1458,7 @@ curl_url_get_ccsid(CURLU *handle, CURLUPart what, char **part,
   result = curl_url_get(handle, what, &s, flags);
   if(result == CURLUE_OK) {
     if(s) {
-      *part = dynconvert(ccsid, s, -1, ASCII_CCSID);
+      *part = dynconvert(ccsid, s, -1, ASCII_CCSID, NULL);
       if(!*part)
         result = CURLUE_OUT_OF_MEMORY;
     }
@@ -1472,7 +1476,7 @@ curl_url_set_ccsid(CURLU *handle, CURLUPart what, const char *part,
   CURLUcode result;
 
   if(part) {
-    s = dynconvert(ASCII_CCSID, part, -1, ccsid);
+    s = dynconvert(ASCII_CCSID, part, -1, ccsid, NULL);
     if(!s)
       return CURLUE_OUT_OF_MEMORY;
   }
@@ -1488,7 +1492,7 @@ curl_easy_option_by_name_ccsid(const char *name, unsigned int ccsid)
   const struct curl_easyoption *option = NULL;
 
   if(name) {
-    char *s = dynconvert(ASCII_CCSID, name, -1, ccsid);
+    char *s = dynconvert(ASCII_CCSID, name, -1, ccsid, NULL);
 
     if(s) {
       option = curl_easy_option_by_name(s);
@@ -1507,7 +1511,7 @@ curl_easy_option_get_name_ccsid(const struct curl_easyoption *option,
   char *name = NULL;
 
   if(option && option->name)
-    name = dynconvert(ccsid, option->name, -1, ASCII_CCSID);
+    name = dynconvert(ccsid, option->name, -1, ASCII_CCSID, NULL);
 
   return (const char *) name;
 }
@@ -1521,7 +1525,7 @@ curl_easy_header_ccsid(CURL *easy, const char *name, size_t index,
   CURLHcode result = CURLHE_BAD_ARGUMENT;
 
   if(name) {
-    char *s = dynconvert(ASCII_CCSID, name, -1, ccsid);
+    char *s = dynconvert(ASCII_CCSID, name, -1, ccsid, NULL);
 
     result = CURLHE_OUT_OF_MEMORY;
     if(s) {