Commit 45d883d8 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

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 f851f768.

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
parent 3ef6418b
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -36,9 +36,6 @@ To be addressed in 7.21.8 (or 7.22.0?)
301 - "Forcing select on vista"
      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
      http://curl.haxx.se/mail/lib-2011-07/0186.html and
      http://curl.haxx.se/mail/lib-2011-08/0008.html
+12 −37
Original line number Diff line number Diff line
@@ -484,46 +484,18 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
        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:
      current_form->flags |= HTTPPOST_PTRBUFFER;
      current_form->flags |= HTTPPOST_PTRBUFFER|HTTPPOST_BUFFER;
      if(current_form->buffer)
        return_value = CURL_FORMADD_OPTION_TWICE;
      else {
        char *buffer =
          array_state?array_value:va_arg(params, char *);
        if(buffer)
        if(buffer) {
          current_form->buffer = buffer; /* store for the moment */
          current_form->value = buffer; /* make it non-NULL to be accepted
                                           as fine */
        }
        else
          return_value = CURL_FORMADD_NULL;
      }
@@ -603,6 +575,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
        break;
      }
    case CURLFORM_FILENAME:
    case CURLFORM_BUFFER:
      {
        const char *filename = array_state?array_value:
          va_arg(params, char *);
@@ -619,6 +592,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
      }
    default:
      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)
      free(form->name); /* free the name */
    if(!(form->flags & (HTTPPOST_PTRCONTENTS|HTTPPOST_CALLBACK)) &&
    if(!(form->flags &
         (HTTPPOST_PTRCONTENTS|HTTPPOST_BUFFER|HTTPPOST_CALLBACK)) &&
       form->contents)
      free(form->contents); /* free the contents */
    if(form->contenttype)
+6 −1
Original line number Diff line number Diff line
@@ -45,7 +45,7 @@ s/boundary=----------------------------[a-z0-9]*/boundary=----------------------
POST /554 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
Content-Length: 561
Content-Length: 732
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------

@@ -67,6 +67,11 @@ postit2.c
Content-Disposition: form-data; name="submit"

send
------------------------------
Content-Disposition: form-data; name="somename"; filename="somefile.txt"
Content-Type: application/octet-stream

blah blah
--------------------------------
</protocol>
</verify>
+10 −0
Original line number Diff line number Diff line
@@ -136,6 +136,16 @@ int test(char *URL)
  if(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) {
    fprintf(stderr, "curl_easy_init() failed\n");
    curl_formfree(formpost);