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,
const char *method, size_t m_len,
const char *scheme, size_t s_len,
goto out;
memcpy(req->method, method, m_len);
if(scheme) {
- req->scheme = my_strndup(scheme, s_len);
+ req->scheme = Curl_strndup(scheme, s_len);
if(!req->scheme)
goto out;
}
if(authority) {
- req->authority = my_strndup(authority, a_len);
+ req->authority = Curl_strndup(authority, a_len);
if(!req->authority)
goto out;
}
if(path) {
- req->path = my_strndup(path, p_len);
+ req->path = Curl_strndup(path, p_len);
if(!req->path)
goto out;
}
* Curl_strndup(source, length)
*
* 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.
*
***************************************************************************/
-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)
return NULL;
- strncpy(buf, src, length);
+ memcpy(buf, src, length);
buf[length] = 0;
return buf;
}
#endif
void *Curl_memdup(const void *src, size_t buffer_length);
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 */