diff --git a/lib/formdata.c b/lib/formdata.c index 08715d5b3..e032382b1 100644 --- a/lib/formdata.c +++ b/lib/formdata.c @@ -1044,22 +1044,24 @@ void curl_formfree(struct curl_httppost *form) } while((form=next)); /* continue */ } -struct FormData *Curl_getFormData(struct curl_httppost *post, - int *sizep) +CURLcode Curl_getFormData(struct FormData **finalform, + struct curl_httppost *post, + int *sizep) { struct FormData *form = NULL; struct FormData *firstform; - struct curl_httppost *file; + CURLcode result = CURLE_OK; int size =0; char *boundary; char *fileboundary=NULL; struct curl_slist* curList; + *finalform=NULL; /* default form is empty */ if(!post) - return NULL; /* no input => no output! */ + return result; /* no input => no output! */ boundary = Curl_FormBoundary(); @@ -1166,20 +1168,24 @@ struct FormData *Curl_getFormData(struct curl_httppost *post, /*VMS?? Stream files are OK, as are FIXED & VAR files WITHOUT implied CC */ /*VMS?? For implied CC, every record needs to have a \n appended & 1 added to SIZE */ if(fileread) { - while((nread = fread(buffer, 1, 1024, fileread))) { - size += AddFormData(&form, - buffer, - nread); - } + while((nread = fread(buffer, 1, 1024, fileread))) + size += AddFormData(&form, buffer, nread); + if(fileread != stdin) fclose(fileread); } else { +#if 0 /* File wasn't found, add a nothing field! */ size += AddFormData(&form, "", 0); +#endif + Curl_formclean(firstform); + free(boundary); + *finalform = NULL; + return CURLE_READ_ERROR; } } - else { + else { /* include the contents we got */ size += AddFormData(&form, post->contents, post->contentslength); } @@ -1205,7 +1211,9 @@ struct FormData *Curl_getFormData(struct curl_httppost *post, free(boundary); - return firstform; + *finalform=firstform; + + return result; } int Curl_FormInit(struct Form *form, struct FormData *formdata ) diff --git a/lib/formdata.h b/lib/formdata.h index 3dad243a3..1657f4122 100644 --- a/lib/formdata.h +++ b/lib/formdata.h @@ -53,8 +53,10 @@ typedef struct FormInfo { int Curl_FormInit(struct Form *form, struct FormData *formdata ); -struct FormData *Curl_getFormData(struct HttpPost *post, - int *size); +CURLcode +Curl_getFormData(struct FormData **, + struct HttpPost *post, + int *size); /* fread() emulation */ int Curl_FormReader(char *buffer, diff --git a/lib/http.c b/lib/http.c index 758433509..dc074aced 100644 --- a/lib/http.c +++ b/lib/http.c @@ -562,7 +562,13 @@ CURLcode Curl_http(struct connectdata *conn) if(HTTPREQ_POST_FORM == data->set.httpreq) { /* we must build the whole darned post sequence first, so that we have a size of the whole shebang before we start to send it */ - http->sendit = Curl_getFormData(data->set.httppost, &http->postsize); + result = Curl_getFormData(&http->sendit, data->set.httppost, + &http->postsize); + if(CURLE_OK != result) { + /* Curl_getFormData() doesn't use failf() */ + failf(data, "failed creating formpost data"); + return result; + } } if(!checkheaders(data, "Host:")) {