aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/url.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/lib/url.c b/lib/url.c
index 373fd4534..6f6d8c226 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -1036,10 +1036,10 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
result = Curl_setstropt(&data->set.str[STRING_COPYPOSTFIELDS], argptr);
else {
/*
- * Check that request length does not overflow the size_t type.
+ * Check that requested length does not overflow the size_t type.
*/
- if ((data->set.postfieldsize < 1) ||
+ if ((data->set.postfieldsize < 0) ||
((sizeof(curl_off_t) != sizeof(size_t)) &&
(data->set.postfieldsize > (curl_off_t)((size_t)-1))))
result = CURLE_OUT_OF_MEMORY;
@@ -1047,14 +1047,22 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
char * p;
(void) Curl_setstropt(&data->set.str[STRING_COPYPOSTFIELDS], NULL);
- p = malloc(data->set.postfieldsize);
+
+ /* 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.
+ */
+ p = malloc(data->set.postfieldsize? data->set.postfieldsize: 1);
if (!p)
result = CURLE_OUT_OF_MEMORY;
else {
- memcpy(p, argptr, data->set.postfieldsize);
+ if (data->set.postfieldsize)
+ memcpy(p, argptr, data->set.postfieldsize);
+
data->set.str[STRING_COPYPOSTFIELDS] = p;
- }
+ }
}
}