]> granicus.if.org Git - php/commitdiff
- Implemented FR #50692, not uploaded files don't count towards
authorGustavo André dos Santos Lopes <cataphract@php.net>
Mon, 4 Oct 2010 01:27:33 +0000 (01:27 +0000)
committerGustavo André dos Santos Lopes <cataphract@php.net>
Mon, 4 Oct 2010 01:27:33 +0000 (01:27 +0000)
  max_file_uploads limit.
- As a side improvement, temporary files are not opened for
  empty uploads and, in debug mode, 0-length uploads.

main/rfc1867.c
tests/basic/rfc1867_max_file_uploads_empty_files.phpt [new file with mode: 0644]
tests/basic/rfc1867_max_file_uploads_empty_files_debug.phpt [new file with mode: 0644]

index e77093c34424e94d7cd122363c2382ad8433e7cf..0bebe6fb5d77abe3eb5a2bc045e1027b49d8bef5 100644 (file)
@@ -1003,16 +1003,8 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) /* {{{ */
                        }
 
                        total_bytes = cancel_upload = 0;
-
-                       if (!skip_upload) {
-                               /* Handle file */
-                               fd = php_open_temporary_fd_ex(PG(upload_tmp_dir), "php", &temp_filename, 1 TSRMLS_CC);
-                               upload_cnt--;
-                               if (fd == -1) {
-                                       sapi_module.sapi_error(E_WARNING, "File upload error - unable to create a temporary file");
-                                       cancel_upload = UPLOAD_ERROR_E;
-                               }
-                       }
+                       temp_filename = NULL;
+                       fd = -1;
 
                        if (!skip_upload && php_rfc1867_callback != NULL) {
                                multipart_event_file_start event_file_start;
@@ -1021,13 +1013,6 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) /* {{{ */
                                event_file_start.name = param;
                                event_file_start.filename = &filename;
                                if (php_rfc1867_callback(MULTIPART_EVENT_FILE_START, &event_file_start, &event_extra_data TSRMLS_CC) == FAILURE) {
-                                       if (temp_filename) {
-                                               if (cancel_upload != UPLOAD_ERROR_E) { /* file creation failed */
-                                                       close(fd);
-                                                       unlink(temp_filename);
-                                               }
-                                               efree(temp_filename);
-                                       }
                                        temp_filename = "";
                                        efree(param);
                                        efree(filename);
@@ -1050,7 +1035,26 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) /* {{{ */
 
                        offset = 0;
                        end = 0;
-                       while (!cancel_upload && (blen = multipart_buffer_read(mbuff, buff, sizeof(buff), &end TSRMLS_CC)))
+                       
+                       if (!cancel_upload) {
+                               /* only bother to open temp file if we have data */
+                               blen = multipart_buffer_read(mbuff, buff, sizeof(buff), &end TSRMLS_CC);
+#if DEBUG_FILE_UPLOAD
+                               if (blen > 0) {
+#else
+                               /* in non-debug mode we have no problem with 0-length files */
+                               {
+#endif
+                                       fd = php_open_temporary_fd_ex(PG(upload_tmp_dir), "php", &temp_filename, 1 TSRMLS_CC);
+                                       upload_cnt--;
+                                       if (fd == -1) {
+                                               sapi_module.sapi_error(E_WARNING, "File upload error - unable to create a temporary file");
+                                               cancel_upload = UPLOAD_ERROR_E;
+                                       }
+                               }
+                       }
+
+                       while (!cancel_upload && (blen > 0))
                        {
                                if (php_rfc1867_callback != NULL) {
                                        multipart_event_file_data event_file_data;
@@ -1095,10 +1099,15 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) /* {{{ */
                                        }
                                        offset += wlen;
                                }
+
+                               /* read data for next iteration */
+                               blen = multipart_buffer_read(mbuff, buff, sizeof(buff), &end TSRMLS_CC);
                        }
+
                        if (fd != -1) { /* may not be initialized if file could not be created */
                                close(fd);
                        }
+
                        if (!cancel_upload && !end) {
 #if DEBUG_FILE_UPLOAD
                                sapi_module.sapi_error(E_NOTICE, "Missing mime boundary at the end of the data for file %s", strlen(filename) > 0 ? filename : "");
diff --git a/tests/basic/rfc1867_max_file_uploads_empty_files.phpt b/tests/basic/rfc1867_max_file_uploads_empty_files.phpt
new file mode 100644 (file)
index 0000000..76327fd
--- /dev/null
@@ -0,0 +1,101 @@
+--TEST--\r
+rfc1867 max_file_uploads - empty files shouldn't count (non-debug version)\r
+--SKIPIF--\r
+<?php if(function_exists("leak")) print "skip only for non-debug builds"; ?>\r
+--INI--\r
+file_uploads=1\r
+error_reporting=E_ALL\r
+max_file_uploads=2\r
+--POST_RAW--\r
+Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737\r
+-----------------------------20896060251896012921717172737\r
+Content-Disposition: form-data; name="file2"; filename=""\r
+Content-Type: text/plain-file\r
+\r
+\r
+-----------------------------20896060251896012921717172737\r
+Content-Disposition: form-data; name="file3"; filename=""\r
+Content-Type: text/plain-file\r
+\r
+33\r
+-----------------------------20896060251896012921717172737\r
+Content-Disposition: form-data; name="file4"; filename="file4.txt"\r
+Content-Type: text/plain-file\r
+\r
+\r
+-----------------------------20896060251896012921717172737\r
+Content-Disposition: form-data; name="file1"; filename="file1.txt"\r
+Content-Type: text/plain-file\r
+\r
+1\r
+-----------------------------20896060251896012921717172737--\r
+--FILE--\r
+<?php\r
+var_dump($_FILES);\r
+var_dump($_POST);\r
+if (is_uploaded_file($_FILES["file1"]["tmp_name"])) {\r
+       var_dump(file_get_contents($_FILES["file1"]["tmp_name"]));\r
+}\r
+if (is_uploaded_file($_FILES["file4"]["tmp_name"])) {\r
+       var_dump(file_get_contents($_FILES["file4"]["tmp_name"]));\r
+}\r
+?>\r
+--EXPECTF--\r
+array(4) {\r
+  ["file2"]=>\r
+  array(5) {\r
+    ["name"]=>\r
+    string(0) ""\r
+    ["type"]=>\r
+    string(0) ""\r
+    ["tmp_name"]=>\r
+    string(0) ""\r
+    ["error"]=>\r
+    int(4)\r
+    ["size"]=>\r
+    int(0)\r
+  }\r
+  ["file3"]=>\r
+  array(5) {\r
+    ["name"]=>\r
+    string(0) ""\r
+    ["type"]=>\r
+    string(0) ""\r
+    ["tmp_name"]=>\r
+    string(0) ""\r
+    ["error"]=>\r
+    int(4)\r
+    ["size"]=>\r
+    int(0)\r
+  }\r
+  ["file4"]=>\r
+  array(5) {\r
+    ["name"]=>\r
+    string(9) "file4.txt"\r
+    ["type"]=>\r
+    string(15) "text/plain-file"\r
+    ["tmp_name"]=>\r
+    string(%d) "%s"\r
+    ["error"]=>\r
+    int(0)\r
+    ["size"]=>\r
+    int(0)\r
+  }\r
+  ["file1"]=>\r
+  array(5) {\r
+    ["name"]=>\r
+    string(9) "file1.txt"\r
+    ["type"]=>\r
+    string(15) "text/plain-file"\r
+    ["tmp_name"]=>\r
+    string(%d) "%s"\r
+    ["error"]=>\r
+    int(0)\r
+    ["size"]=>\r
+    int(1)\r
+  }\r
+}\r
+array(0) {\r
+}\r
+string(1) "1"\r
+string(0) ""\r
diff --git a/tests/basic/rfc1867_max_file_uploads_empty_files_debug.phpt b/tests/basic/rfc1867_max_file_uploads_empty_files_debug.phpt
new file mode 100644 (file)
index 0000000..279851c
--- /dev/null
@@ -0,0 +1,102 @@
+--TEST--\r
+rfc1867 max_file_uploads - empty files shouldn't count (debug version)\r
+--SKIPIF--\r
+<?php if(!function_exists("leak")) print "skip only for debug builds"; ?>\r
+--INI--\r
+file_uploads=1\r
+error_reporting=E_ALL\r
+max_file_uploads=1\r
+--POST_RAW--\r
+Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737\r
+-----------------------------20896060251896012921717172737\r
+Content-Disposition: form-data; name="file2"; filename=""\r
+Content-Type: text/plain-file\r
+\r
+\r
+-----------------------------20896060251896012921717172737\r
+Content-Disposition: form-data; name="file3"; filename=""\r
+Content-Type: text/plain-file\r
+\r
+33\r
+-----------------------------20896060251896012921717172737\r
+Content-Disposition: form-data; name="file4"; filename="file4.txt"\r
+Content-Type: text/plain-file\r
+\r
+\r
+-----------------------------20896060251896012921717172737\r
+Content-Disposition: form-data; name="file1"; filename="file1.txt"\r
+Content-Type: text/plain-file\r
+\r
+1\r
+-----------------------------20896060251896012921717172737--\r
+--FILE--\r
+<?php\r
+var_dump($_FILES);\r
+var_dump($_POST);\r
+if (is_uploaded_file($_FILES["file1"]["tmp_name"])) {\r
+       var_dump(file_get_contents($_FILES["file1"]["tmp_name"]));\r
+}\r
+?>\r
+--EXPECTF--\r
+Notice: No file uploaded in Unknown on line 0\r
+\r
+Notice: No file uploaded in Unknown on line 0\r
+\r
+Warning: Uploaded file size 0 - file [file4=file4.txt] not saved in Unknown on line 0\r
+array(4) {\r
+  ["file2"]=>\r
+  array(5) {\r
+    ["name"]=>\r
+    string(0) ""\r
+    ["type"]=>\r
+    string(0) ""\r
+    ["tmp_name"]=>\r
+    string(0) ""\r
+    ["error"]=>\r
+    int(4)\r
+    ["size"]=>\r
+    int(0)\r
+  }\r
+  ["file3"]=>\r
+  array(5) {\r
+    ["name"]=>\r
+    string(0) ""\r
+    ["type"]=>\r
+    string(0) ""\r
+    ["tmp_name"]=>\r
+    string(0) ""\r
+    ["error"]=>\r
+    int(4)\r
+    ["size"]=>\r
+    int(0)\r
+  }\r
+  ["file4"]=>\r
+  array(5) {\r
+    ["name"]=>\r
+    string(9) "file4.txt"\r
+    ["type"]=>\r
+    string(0) ""\r
+    ["tmp_name"]=>\r
+    string(0) ""\r
+    ["error"]=>\r
+    int(5)\r
+    ["size"]=>\r
+    int(0)\r
+  }\r
+  ["file1"]=>\r
+  array(5) {\r
+    ["name"]=>\r
+    string(9) "file1.txt"\r
+    ["type"]=>\r
+    string(15) "text/plain-file"\r
+    ["tmp_name"]=>\r
+    string(%d) "%s"\r
+    ["error"]=>\r
+    int(0)\r
+    ["size"]=>\r
+    int(1)\r
+  }\r
+}\r
+array(0) {\r
+}\r
+string(1) "1"\r