Index: formdata.c =================================================================== RCS file: /cvsroot/curl/curl/lib/formdata.c,v retrieving revision 1.86 diff -C13 -r1.86 formdata.c *** formdata.c 22 Dec 2004 20:12:15 -0000 1.86 --- formdata.c 1 Apr 2005 00:56:45 -0000 *************** *** 1296,1331 **** size_t Curl_FormReader(char *buffer, size_t size, size_t nitems, FILE *mydata) { struct Form *form; size_t wantedsize; size_t gotsize = 0; form=(struct Form *)mydata; wantedsize = size * nitems; ! if(!form->data) ! return 0; /* nothing, error, empty */ ! ! if(form->data->type == FORM_FILE) { gotsize = readfromfile(form, buffer, wantedsize); ! ! if(gotsize) ! /* If positive or -1, return. If zero, continue! */ return gotsize; } do { if( (form->data->length - form->sent ) > wantedsize - gotsize) { memcpy(buffer + gotsize , form->data->line + form->sent, wantedsize - gotsize); form->sent += wantedsize-gotsize; return wantedsize; } memcpy(buffer+gotsize, --- 1296,1338 ---- size_t Curl_FormReader(char *buffer, size_t size, size_t nitems, FILE *mydata) { struct Form *form; size_t wantedsize; size_t gotsize = 0; form=(struct Form *)mydata; wantedsize = size * nitems; ! while (form->data && form->data->type == FORM_FILE) { gotsize = readfromfile(form, buffer, wantedsize); ! if (gotsize) { return gotsize; + } + /* + * If gotsize is 0, we already posted the entire file. + * But returning 0 would signal the end of the form. + * So we continue on, noting that readfromfile already + * set form->data to the next form element or NULL. + */ } + + if (!form->data) { + return 0; /* Done posting the form. */ + } + do { if( (form->data->length - form->sent ) > wantedsize - gotsize) { memcpy(buffer + gotsize , form->data->line + form->sent, wantedsize - gotsize); form->sent += wantedsize-gotsize; return wantedsize; } memcpy(buffer+gotsize,