]> granicus.if.org Git - curl/commitdiff
CURLFORM_STREAM: acknowledge CURLFORM_FILENAME
authorDaniel Stenberg <daniel@haxx.se>
Fri, 17 Jun 2011 20:21:36 +0000 (22:21 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Fri, 17 Jun 2011 20:23:42 +0000 (22:23 +0200)
The CURLFORM_STREAM is documented to only insert a file name (and thus
look like a file upload) in the part if CURLFORM_FILENAME is set, but in
reality it always inserted a filename="" and if CURLFORM_FILENAME wasn't
set, it would insert insert rubbish (or possibly crash).

This is now fixed to work as documented, and test 554 has been extended
to verify this.

Reported by: Sascha Swiercy
Bug: http://curl.haxx.se/mail/lib-2011-06/0070.html

lib/formdata.c
tests/data/test554
tests/libtest/lib554.c

index 5419371deba839f72f5700e3af7b6f01c3491420..aa5a79ac1ece9a40637799e3e8f8d4299cadc82a 100644 (file)
@@ -1134,15 +1134,17 @@ CURLcode Curl_getformdata(struct SessionHandle *data,
         /* it should be noted that for the HTTPPOST_FILENAME and
            HTTPPOST_CALLBACK cases the ->showfilename struct member is always
            assigned at this point */
-        char *filebasename=
-          (!post->showfilename)?strippath(post->contents):NULL;
-
-        result = AddFormDataf(&form, &size,
-                              "; filename=\"%s\"",
-                              (post->showfilename?post->showfilename:
-                               filebasename));
-        if(filebasename)
-          free(filebasename);
+        if(post->showfilename || (post->flags & HTTPPOST_FILENAME)) {
+          char *filebasename=
+            (!post->showfilename)?strippath(post->contents):NULL;
+
+          result = AddFormDataf(&form, &size,
+                                "; filename=\"%s\"",
+                                (post->showfilename?post->showfilename:
+                                 filebasename));
+          if(filebasename)
+            free(filebasename);
+        }
 
         if(result)
           break;
index 134f7ef970274170a2813206363d120e5104f0f6..7fdc353fcc75c653d112a3b4659f79504207842e 100644 (file)
@@ -39,13 +39,13 @@ s/^------------------------------[a-z0-9]*/------------------------------/
 s/boundary=----------------------------[a-z0-9]*/boundary=----------------------------/
 </strippart>
 # Note that the stripping above removes 12 bytes from every occurance of the
-# boundary string and since 4 of them are in the body contents, we see
-# 415 - (4*12) here == 367 bytes.
+# boundary string and since 5 of them are in the body contents, we see
+# (5*12) == 60 bytes less
 <protocol>
 POST /554 HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
 Accept: */*\r
-Content-Length: 415\r
+Content-Length: 561\r
 Expect: 100-continue\r
 Content-Type: multipart/form-data; boundary=----------------------------\r
 \r
@@ -54,6 +54,11 @@ Content-Disposition: form-data; name="sendfile"; filename="postit2.c"
 \r
 this is what we post to the silly web server
 \r
+------------------------------\r
+Content-Disposition: form-data; name="callbackdata"\r
+\r
+this is what we post to the silly web server
+\r
 ------------------------------\r
 Content-Disposition: form-data; name="filename"\r
 \r
index d510268e7d87322a88a0e933597d022ff04b1b29..ed8d13f0504fa4dbba10edfe4435de233d36ed5a 100644 (file)
@@ -64,6 +64,7 @@ int test(char *URL)
   struct curl_httppost *formpost=NULL;
   struct curl_httppost *lastptr=NULL;
   struct WriteThis pooh;
+  struct WriteThis pooh2;
 
   if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
     fprintf(stderr, "curl_global_init() failed\n");
@@ -85,6 +86,23 @@ int test(char *URL)
   if(formrc)
     printf("curl_formadd(1) = %d\n", (int)formrc);
 
+  /* Now add the same data with another name and make it not look like
+     a file upload but still using the callback */
+
+  pooh2.readptr = data;
+  pooh2.sizeleft = strlen(data);
+
+  /* Fill in the file upload field */
+  formrc = curl_formadd(&formpost,
+                        &lastptr,
+                        CURLFORM_COPYNAME, "callbackdata",
+                        CURLFORM_STREAM, &pooh2,
+                        CURLFORM_CONTENTSLENGTH, pooh2.sizeleft,
+                        CURLFORM_END);
+
+  if(formrc)
+    printf("curl_formadd(1) = %d\n", (int)formrc);
+
   /* Fill in the filename field */
   formrc = curl_formadd(&formpost,
                         &lastptr,