strdup: do Curl_strndup without strncpy

To avoid (false positive) gcc-13 compiler warnings.

Follow-up to 4855debd8a

Assisted-by: Jay Satiro
Reported-by: Viktor Szakats
Fixes #12258
This commit is contained in:
Daniel Stenberg 2023-11-04 23:47:05 +01:00
parent 46878b9e3f
commit ac57e69b58
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
3 changed files with 12 additions and 19 deletions

View File

@ -4608,17 +4608,6 @@ out:
return result; return result;
} }
/* simple implementation of strndup(), which isn't portable */
static char *my_strndup(const char *ptr, size_t len)
{
char *copy = malloc(len + 1);
if(!copy)
return NULL;
memcpy(copy, ptr, len);
copy[len] = '\0';
return copy;
}
CURLcode Curl_http_req_make(struct httpreq **preq, CURLcode Curl_http_req_make(struct httpreq **preq,
const char *method, size_t m_len, const char *method, size_t m_len,
const char *scheme, size_t s_len, const char *scheme, size_t s_len,
@ -4637,17 +4626,17 @@ CURLcode Curl_http_req_make(struct httpreq **preq,
goto out; goto out;
memcpy(req->method, method, m_len); memcpy(req->method, method, m_len);
if(scheme) { if(scheme) {
req->scheme = my_strndup(scheme, s_len); req->scheme = Curl_strndup(scheme, s_len);
if(!req->scheme) if(!req->scheme)
goto out; goto out;
} }
if(authority) { if(authority) {
req->authority = my_strndup(authority, a_len); req->authority = Curl_strndup(authority, a_len);
if(!req->authority) if(!req->authority)
goto out; goto out;
} }
if(path) { if(path) {
req->path = my_strndup(path, p_len); req->path = Curl_strndup(path, p_len);
if(!req->path) if(!req->path)
goto out; goto out;
} }

View File

@ -104,17 +104,21 @@ void *Curl_memdup(const void *src, size_t length)
* Curl_strndup(source, length) * Curl_strndup(source, length)
* *
* Copies the 'source' string to a newly allocated buffer (that is returned). * Copies the 'source' string to a newly allocated buffer (that is returned).
* Copies not more than 'length' bytes then adds a null terminator. * Copies not more than 'length' bytes (up to a null terminator) then adds a
* null terminator.
* *
* Returns the new pointer or NULL on failure. * Returns the new pointer or NULL on failure.
* *
***************************************************************************/ ***************************************************************************/
void *Curl_strndup(const void *src, size_t length) void *Curl_strndup(const char *src, size_t length)
{ {
char *buf = malloc(length + 1); char *buf = memchr(src, '\0', length);
if(buf)
length = buf - src;
buf = malloc(length + 1);
if(!buf) if(!buf)
return NULL; return NULL;
strncpy(buf, src, length); memcpy(buf, src, length);
buf[length] = 0; buf[length] = 0;
return buf; return buf;
} }

View File

@ -33,6 +33,6 @@ wchar_t* Curl_wcsdup(const wchar_t* src);
#endif #endif
void *Curl_memdup(const void *src, size_t buffer_length); void *Curl_memdup(const void *src, size_t buffer_length);
void *Curl_saferealloc(void *ptr, size_t size); void *Curl_saferealloc(void *ptr, size_t size);
void *Curl_strndup(const void *src, size_t length); void *Curl_strndup(const char *src, size_t length);
#endif /* HEADER_CURL_STRDUP_H */ #endif /* HEADER_CURL_STRDUP_H */