aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/formdata.c30
-rw-r--r--lib/formdata.h6
-rw-r--r--lib/http.c8
3 files changed, 30 insertions, 14 deletions
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:")) {