1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-21 23:58:49 -05:00

CURLFORM_BUFFER: insert filename as documented

A regression where CURLFORM_BUFFER stopped to properly insert the file
name part in the formpart. Bug introduced in commit f851f76857.

Added CURLFORM_BUFFER use to test 554 to verify this.

Bug: http://curl.haxx.se/mail/lib-2011-07/0176.html
Reported by: Henry Ludemann
This commit is contained in:
Daniel Stenberg 2011-08-08 10:21:03 +02:00
parent 3ef6418b61
commit 45d883d88d
4 changed files with 28 additions and 41 deletions

View File

@ -36,9 +36,6 @@ To be addressed in 7.21.8 (or 7.22.0?)
301 - "Forcing select on vista" 301 - "Forcing select on vista"
http://curl.haxx.se/mail/lib-2011-07/0128.html http://curl.haxx.se/mail/lib-2011-07/0128.html
302 - "Problem with file upload using CURLFORM_BUFFER" (Regression)
Henry Ludemann http://curl.haxx.se/mail/lib-2011-07/0176.html
303 - "Added AUTH NTLM for SMTP" Steve Holme 303 - "Added AUTH NTLM for SMTP" Steve Holme
http://curl.haxx.se/mail/lib-2011-07/0186.html and http://curl.haxx.se/mail/lib-2011-07/0186.html and
http://curl.haxx.se/mail/lib-2011-08/0008.html http://curl.haxx.se/mail/lib-2011-08/0008.html

View File

@ -459,7 +459,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
if(current_form->flags & HTTPPOST_FILENAME) { if(current_form->flags & HTTPPOST_FILENAME) {
if(filename) { if(filename) {
if((current_form = AddFormInfo(strdup(filename), if((current_form = AddFormInfo(strdup(filename),
NULL, current_form)) == NULL) NULL, current_form)) == NULL)
return_value = CURL_FORMADD_MEMORY; return_value = CURL_FORMADD_MEMORY;
} }
else else
@ -484,46 +484,18 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
break; break;
} }
case CURLFORM_BUFFER:
{
const char *filename = array_state?array_value:
va_arg(params, char *);
if(current_form->value) {
if(current_form->flags & HTTPPOST_BUFFER) {
if(filename) {
if((current_form = AddFormInfo(strdup(filename),
NULL, current_form)) == NULL)
return_value = CURL_FORMADD_MEMORY;
}
else
return_value = CURL_FORMADD_NULL;
}
else
return_value = CURL_FORMADD_OPTION_TWICE;
}
else {
if(filename) {
current_form->value = strdup(filename);
if(!current_form->value)
return_value = CURL_FORMADD_MEMORY;
}
else
return_value = CURL_FORMADD_NULL;
current_form->flags |= HTTPPOST_BUFFER;
}
break;
}
case CURLFORM_BUFFERPTR: case CURLFORM_BUFFERPTR:
current_form->flags |= HTTPPOST_PTRBUFFER; current_form->flags |= HTTPPOST_PTRBUFFER|HTTPPOST_BUFFER;
if(current_form->buffer) if(current_form->buffer)
return_value = CURL_FORMADD_OPTION_TWICE; return_value = CURL_FORMADD_OPTION_TWICE;
else { else {
char *buffer = char *buffer =
array_state?array_value:va_arg(params, char *); array_state?array_value:va_arg(params, char *);
if(buffer) if(buffer) {
current_form->buffer = buffer; /* store for the moment */ current_form->buffer = buffer; /* store for the moment */
current_form->value = buffer; /* make it non-NULL to be accepted
as fine */
}
else else
return_value = CURL_FORMADD_NULL; return_value = CURL_FORMADD_NULL;
} }
@ -564,8 +536,8 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
if(current_form->flags & HTTPPOST_FILENAME) { if(current_form->flags & HTTPPOST_FILENAME) {
if(contenttype) { if(contenttype) {
if((current_form = AddFormInfo(NULL, if((current_form = AddFormInfo(NULL,
strdup(contenttype), strdup(contenttype),
current_form)) == NULL) current_form)) == NULL)
return_value = CURL_FORMADD_MEMORY; return_value = CURL_FORMADD_MEMORY;
} }
else else
@ -603,6 +575,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
break; break;
} }
case CURLFORM_FILENAME: case CURLFORM_FILENAME:
case CURLFORM_BUFFER:
{ {
const char *filename = array_state?array_value: const char *filename = array_state?array_value:
va_arg(params, char *); va_arg(params, char *);
@ -619,6 +592,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
} }
default: default:
return_value = CURL_FORMADD_UNKNOWN_OPTION; return_value = CURL_FORMADD_UNKNOWN_OPTION;
break;
} }
} }
@ -922,7 +896,8 @@ void curl_formfree(struct curl_httppost *form)
if(!(form->flags & HTTPPOST_PTRNAME) && form->name) if(!(form->flags & HTTPPOST_PTRNAME) && form->name)
free(form->name); /* free the name */ free(form->name); /* free the name */
if(!(form->flags & (HTTPPOST_PTRCONTENTS|HTTPPOST_CALLBACK)) && if(!(form->flags &
(HTTPPOST_PTRCONTENTS|HTTPPOST_BUFFER|HTTPPOST_CALLBACK)) &&
form->contents) form->contents)
free(form->contents); /* free the contents */ free(form->contents); /* free the contents */
if(form->contenttype) if(form->contenttype)

View File

@ -45,7 +45,7 @@ s/boundary=----------------------------[a-z0-9]*/boundary=----------------------
POST /554 HTTP/1.1 POST /554 HTTP/1.1
Host: %HOSTIP:%HTTPPORT Host: %HOSTIP:%HTTPPORT
Accept: */* Accept: */*
Content-Length: 561 Content-Length: 732
Expect: 100-continue Expect: 100-continue
Content-Type: multipart/form-data; boundary=---------------------------- Content-Type: multipart/form-data; boundary=----------------------------
@ -67,6 +67,11 @@ postit2.c
Content-Disposition: form-data; name="submit" Content-Disposition: form-data; name="submit"
send send
------------------------------
Content-Disposition: form-data; name="somename"; filename="somefile.txt"
Content-Type: application/octet-stream
blah blah
-------------------------------- --------------------------------
</protocol> </protocol>
</verify> </verify>

View File

@ -136,6 +136,16 @@ int test(char *URL)
if(formrc) if(formrc)
printf("curl_formadd(3) = %d\n", (int)formrc); printf("curl_formadd(3) = %d\n", (int)formrc);
formrc = curl_formadd(&formpost, &lastptr,
CURLFORM_COPYNAME, "somename",
CURLFORM_BUFFER, "somefile.txt",
CURLFORM_BUFFERPTR, "blah blah",
CURLFORM_BUFFERLENGTH, 9,
CURLFORM_END);
if(formrc)
printf("curl_formadd(4) = %d\n", (int)formrc);
if ((curl = curl_easy_init()) == NULL) { if ((curl = curl_easy_init()) == NULL) {
fprintf(stderr, "curl_easy_init() failed\n"); fprintf(stderr, "curl_easy_init() failed\n");
curl_formfree(formpost); curl_formfree(formpost);