setopt: make setopt_copypostfields a separate function

Closes #20688
This commit is contained in:
Daniel Stenberg 2026-02-23 13:47:18 +01:00
parent 3058ed3df8
commit e9786038d6
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2

View file

@ -128,7 +128,8 @@ CURLcode Curl_setblobopt(struct curl_blob **blobp,
return CURLE_OK;
}
static CURLcode setstropt_userpwd(char *option, char **userp, char **passwdp)
static CURLcode setstropt_userpwd(const char *option, char **userp,
char **passwdp)
{
char *user = NULL;
char *passwd = NULL;
@ -1664,7 +1665,7 @@ static CURLcode cookiefile(struct Curl_easy *data, const char *ptr)
#ifndef CURL_DISABLE_PROXY
static CURLcode setopt_cptr_proxy(struct Curl_easy *data, CURLoption option,
char *ptr)
const char *ptr)
{
CURLcode result = CURLE_OK;
struct UserDefined *s = &data->set;
@ -1832,6 +1833,46 @@ static CURLcode setopt_cptr_proxy(struct Curl_easy *data, CURLoption option,
}
#endif
#if !defined(CURL_DISABLE_HTTP) || !defined(CURL_DISABLE_MQTT)
/*
* A string with POST data. Makes curl HTTP POST. Even if it is NULL. If
* needed, CURLOPT_POSTFIELDSIZE must have been set prior to
* CURLOPT_COPYPOSTFIELDS and not altered later.
*/
static CURLcode setopt_copypostfields(const char *ptr, struct UserDefined *s)
{
CURLcode result = CURLE_OK;
if(!ptr || s->postfieldsize == -1)
result = Curl_setstropt(&s->str[STRING_COPYPOSTFIELDS], ptr);
else {
size_t pflen;
if(s->postfieldsize < 0)
return CURLE_BAD_FUNCTION_ARGUMENT;
pflen = curlx_sotouz_range(s->postfieldsize, 0, SIZE_MAX);
if(pflen == SIZE_MAX)
return CURLE_OUT_OF_MEMORY;
else {
/* Allocate even when size == 0. This satisfies the need of possible
later address compare to detect the COPYPOSTFIELDS mode, and to mark
that postfields is used rather than read function or form data.
*/
char *p = curlx_memdup0(ptr, pflen);
if(!p)
return CURLE_OUT_OF_MEMORY;
else {
curlx_free(s->str[STRING_COPYPOSTFIELDS]);
s->str[STRING_COPYPOSTFIELDS] = p;
}
}
}
s->postfields = s->str[STRING_COPYPOSTFIELDS];
s->method = HTTPREQ_POST;
return result;
}
#endif
static CURLcode setopt_cptr(struct Curl_easy *data, CURLoption option,
char *ptr)
{
@ -1901,40 +1942,7 @@ static CURLcode setopt_cptr(struct Curl_easy *data, CURLoption option,
#if !defined(CURL_DISABLE_HTTP) || !defined(CURL_DISABLE_MQTT)
case CURLOPT_COPYPOSTFIELDS:
/*
* A string with POST data. Makes curl HTTP POST. Even if it is NULL.
* If needed, CURLOPT_POSTFIELDSIZE must have been set prior to
* CURLOPT_COPYPOSTFIELDS and not altered later.
*/
if(!ptr || s->postfieldsize == -1)
result = Curl_setstropt(&s->str[STRING_COPYPOSTFIELDS], ptr);
else {
size_t pflen;
if(s->postfieldsize < 0)
return CURLE_BAD_FUNCTION_ARGUMENT;
pflen = curlx_sotouz_range(s->postfieldsize, 0, SIZE_MAX);
if(pflen == SIZE_MAX)
return CURLE_OUT_OF_MEMORY;
else {
/* Allocate even when size == 0. This satisfies the need of possible
later address compare to detect the COPYPOSTFIELDS mode, and to
mark that postfields is used rather than read function or form
data.
*/
char *p = curlx_memdup0(ptr, pflen);
if(!p)
return CURLE_OUT_OF_MEMORY;
else {
curlx_free(s->str[STRING_COPYPOSTFIELDS]);
s->str[STRING_COPYPOSTFIELDS] = p;
}
}
}
s->postfields = s->str[STRING_COPYPOSTFIELDS];
s->method = HTTPREQ_POST;
break;
return setopt_copypostfields(ptr, s);
case CURLOPT_POSTFIELDS:
/*