From b3b7d65239ad14fee33f6beac74fb5e450b8b39d Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Tue, 5 Aug 2025 14:24:15 +0200 Subject: [PATCH] tool: replace three malloc + copy with memdup0 The function already existed for private use in var.c Closes #18185 --- src/tool_cb_hdr.c | 10 +++------- src/tool_strdup.c | 12 ++++++++++++ src/tool_strdup.h | 1 + src/tool_urlglob.c | 6 ++---- src/var.c | 16 +++------------- 5 files changed, 21 insertions(+), 24 deletions(-) diff --git a/src/tool_cb_hdr.c b/src/tool_cb_hdr.c index e988224ac8..85f74cf16d 100644 --- a/src/tool_cb_hdr.c +++ b/src/tool_cb_hdr.c @@ -34,6 +34,7 @@ #include "tool_cb_wrt.h" #include "tool_operate.h" #include "tool_libinfo.h" +#include "tool_strdup.h" #include "memdebug.h" /* keep this as LAST include */ @@ -322,12 +323,9 @@ static char *parse_filename(const char *ptr, size_t len) char *q; char stop = '\0'; - /* simple implementation of strndup() */ - copy = malloc(len + 1); + copy = memdup0(ptr, len); if(!copy) return NULL; - memcpy(copy, ptr, len); - copy[len] = '\0'; p = copy; if(*p == '\'' || *p == '"') { @@ -438,11 +436,9 @@ static void write_linked_location(CURL *curl, const char *location, goto locout; /* Create a null-terminated and whitespace-stripped copy of Location: */ - copyloc = malloc(llen + 1); + copyloc = memdup0(loc, llen); if(!copyloc) goto locout; - memcpy(copyloc, loc, llen); - copyloc[llen] = 0; /* The original URL to use as a base for a relative redirect URL */ if(curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &locurl)) diff --git a/src/tool_strdup.c b/src/tool_strdup.c index a5725d6d40..ff80b56b92 100644 --- a/src/tool_strdup.c +++ b/src/tool_strdup.c @@ -22,6 +22,7 @@ * ***************************************************************************/ #include "tool_strdup.h" +#include "memdebug.h" /* keep this as LAST include */ #ifndef HAVE_STRDUP char *strdup(const char *str) @@ -42,3 +43,14 @@ char *strdup(const char *str) return newstr; } #endif + +char *memdup0(const char *data, size_t len) +{ + char *p = malloc(len + 1); + if(!p) + return NULL; + if(len) + memcpy(p, data, len); + p[len] = 0; + return p; +} diff --git a/src/tool_strdup.h b/src/tool_strdup.h index 9b21618962..275be7c5d9 100644 --- a/src/tool_strdup.h +++ b/src/tool_strdup.h @@ -28,5 +28,6 @@ #ifndef HAVE_STRDUP extern char *strdup(const char *str); #endif +char *memdup0(const char *data, size_t len); #endif /* HEADER_TOOL_STRDUP_H */ diff --git a/src/tool_urlglob.c b/src/tool_urlglob.c index c20bbd4ea3..d79aa2990b 100644 --- a/src/tool_urlglob.c +++ b/src/tool_urlglob.c @@ -27,6 +27,7 @@ #include "tool_doswin.h" #include "tool_urlglob.h" #include "tool_vms.h" +#include "tool_strdup.h" #include "memdebug.h" /* keep this as LAST include */ #define GLOBERROR(string, column, code) \ @@ -45,13 +46,10 @@ static CURLcode glob_fixed(struct URLGlob *glob, char *fixed, size_t len) if(!pat->content.Set.elements) return GLOBERROR("out of memory", 0, CURLE_OUT_OF_MEMORY); - pat->content.Set.elements[0] = malloc(len + 1); + pat->content.Set.elements[0] = memdup0(fixed, len); if(!pat->content.Set.elements[0]) return GLOBERROR("out of memory", 0, CURLE_OUT_OF_MEMORY); - memcpy(pat->content.Set.elements[0], fixed, len); - pat->content.Set.elements[0][len] = 0; - return CURLE_OK; } diff --git a/src/var.c b/src/var.c index b2fc835fbd..85d03f3ce3 100644 --- a/src/var.c +++ b/src/var.c @@ -31,23 +31,13 @@ #include "tool_parsecfg.h" #include "tool_paramhlp.h" #include "tool_writeout_json.h" +#include "tool_strdup.h" #include "var.h" #include "memdebug.h" /* keep this as LAST include */ #define MAX_EXPAND_CONTENT 10000000 #define MAX_VAR_LEN 128 /* max length of a name */ -static char *Memdup(const char *data, size_t len) -{ - char *p = malloc(len + 1); - if(!p) - return NULL; - if(len) - memcpy(p, data, len); - p[len] = 0; - return p; -} - /* free everything */ void varcleanup(struct GlobalConfig *global) { @@ -208,7 +198,7 @@ static ParameterError varfunc(struct GlobalConfig *global, free(c); clen = curlx_dyn_len(out); - c = Memdup(curlx_dyn_ptr(out), clen); + c = memdup0(curlx_dyn_ptr(out), clen); if(!c) { err = PARAM_NO_MEM; break; @@ -379,7 +369,7 @@ static ParameterError addvariable(struct GlobalConfig *global, if(p) { memcpy(p->name, name, nlen); - p->content = contalloc ? content : Memdup(content, clen); + p->content = contalloc ? content : memdup0(content, clen); if(p->content) { p->clen = clen; -- 2.47.2