iliaa           Wed Jul 13 16:47:57 2005 EDT

  Modified files:              (Branch: PHP_4_4)
    /php-src    NEWS 
    /php-src/main       rfc1867.c 
  Log:
  MFH: Fixed bug #33673 (Added detection for partially uploaded files).
  
  
http://cvs.php.net/diff.php/php-src/NEWS?r1=1.1247.2.920.2.15&r2=1.1247.2.920.2.16&ty=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.1247.2.920.2.15 php-src/NEWS:1.1247.2.920.2.16
--- php-src/NEWS:1.1247.2.920.2.15      Tue Jul 12 03:17:33 2005
+++ php-src/NEWS        Wed Jul 13 16:47:55 2005
@@ -1,6 +1,7 @@
 PHP 4                                                                      NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? ??? 2005, Version 4.4.1
+- Fixed bug #33673 (Added detection for partially uploaded files). (Ilia)
 - Fixed bug #33156 (cygwin version of setitimer doesn't accept ITIMER_PROF).
   (Nuno)
 - Fixed bug #31158 (array_splice on $GLOBALS crashes). (Dmitry)
http://cvs.php.net/diff.php/php-src/main/rfc1867.c?r1=1.122.2.34&r2=1.122.2.34.2.1&ty=u
Index: php-src/main/rfc1867.c
diff -u php-src/main/rfc1867.c:1.122.2.34 php-src/main/rfc1867.c:1.122.2.34.2.1
--- php-src/main/rfc1867.c:1.122.2.34   Mon Apr  4 10:59:58 2005
+++ php-src/main/rfc1867.c      Wed Jul 13 16:47:56 2005
@@ -16,7 +16,7 @@
    |          Jani Taskinen <[EMAIL PROTECTED]>                              |
    +----------------------------------------------------------------------+
  */
-/* $Id: rfc1867.c,v 1.122.2.34 2005/04/04 14:59:58 thetaphi Exp $ */
+/* $Id: rfc1867.c,v 1.122.2.34.2.1 2005/07/13 20:47:56 iliaa Exp $ */
 
 /*
  *  This product includes software developed by the Apache Group
@@ -127,6 +127,7 @@
 #define UPLOAD_ERROR_C    3  /* Partially uploaded */
 #define UPLOAD_ERROR_D    4  /* No file uploaded */
 #define UPLOAD_ERROR_E    6  /* Missing /tmp or similar directory */
+#define UPLOAD_ERROR_F    7  /* Failed to write file to disk */
 
 void php_rfc1867_register_constants(TSRMLS_D)
 {
@@ -136,6 +137,7 @@
        REGISTER_MAIN_LONG_CONSTANT("UPLOAD_ERR_PARTIAL",    UPLOAD_ERROR_C,  
CONST_CS | CONST_PERSISTENT);
        REGISTER_MAIN_LONG_CONSTANT("UPLOAD_ERR_NO_FILE",    UPLOAD_ERROR_D,  
CONST_CS | CONST_PERSISTENT);
        REGISTER_MAIN_LONG_CONSTANT("UPLOAD_ERR_NO_TMP_DIR", UPLOAD_ERROR_E,  
CONST_CS | CONST_PERSISTENT);
+       REGISTER_MAIN_LONG_CONSTANT("UPLOAD_ERR_CANT_WRITE", UPLOAD_ERROR_F,  
CONST_CS | CONST_PERSISTENT);
 }
 
 static void normalize_protected_variable(char *varname TSRMLS_DC)
@@ -700,7 +702,7 @@
 
 
 /* read until a boundary condition */
-static int multipart_buffer_read(multipart_buffer *self, char *buf, int bytes 
TSRMLS_DC)
+static int multipart_buffer_read(multipart_buffer *self, char *buf, int bytes, 
int *end TSRMLS_DC)
 {
        int len, max;
        char *bound;
@@ -713,6 +715,9 @@
        /* look for a potential boundary match, only read data up to that point 
*/
        if ((bound = php_ap_memstr(self->buf_begin, self->bytes_in_buffer, 
self->boundary_next, self->boundary_next_len, 1))) {
                max = bound - self->buf_begin;
+               if (end && php_ap_memstr(self->buf_begin, 
self->bytes_in_buffer, self->boundary_next, self->boundary_next_len, 0)) {
+                       *end = 1;
+               }
        } else {
                max = self->bytes_in_buffer;
        }
@@ -749,7 +754,7 @@
        char buf[FILLUNIT], *out=NULL;
        int total_bytes=0, read_bytes=0;
 
-       while((read_bytes = multipart_buffer_read(self, buf, sizeof(buf) 
TSRMLS_CC))) {
+       while((read_bytes = multipart_buffer_read(self, buf, sizeof(buf), NULL 
TSRMLS_CC))) {
                out = erealloc(out, total_bytes + read_bytes + 1);
                memcpy(out + total_bytes, buf, read_bytes);
                total_bytes += read_bytes;
@@ -853,6 +858,7 @@
 
                if ((cd = php_mime_get_hdr_value(header, 
"Content-Disposition"))) {
                        char *pair=NULL;
+                       int end=0;
                        
                        while (isspace(*cd)) {
                                ++cd;
@@ -981,7 +987,8 @@
                                cancel_upload = UPLOAD_ERROR_D;
                        }
 
-                       while (!cancel_upload && (blen = 
multipart_buffer_read(mbuff, buff, sizeof(buff) TSRMLS_CC)))
+                       end = 0;
+                       while (!cancel_upload && (blen = 
multipart_buffer_read(mbuff, buff, sizeof(buff), &end TSRMLS_CC)))
                        {
                                if (PG(upload_max_filesize) > 0 && total_bytes 
> PG(upload_max_filesize)) {
                                        sapi_module.sapi_error(E_WARNING, 
"upload_max_filesize of %ld bytes exceeded - file [%s=%s] not saved", 
PG(upload_max_filesize), param, filename);
@@ -994,7 +1001,7 @@
                        
                                        if (wlen < blen) {
                                                
sapi_module.sapi_error(E_WARNING, "Only %d bytes were written, expected to 
write %d", wlen, blen);
-                                               cancel_upload = UPLOAD_ERROR_C;
+                                               cancel_upload = UPLOAD_ERROR_F;
                                        } else {
                                                total_bytes += wlen;
                                        }
@@ -1004,6 +1011,13 @@
                                close(fd);
                        }
 
+                       if (!cancel_upload && !end) {
+#ifdef 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 : 
"");
+#endif
+                               cancel_upload = UPLOAD_ERROR_C;
+                       }
+
 #ifdef DEBUG_FILE_UPLOAD
                        if(strlen(filename) > 0 && total_bytes == 0 && 
!cancel_upload) {
                                sapi_module.sapi_error(E_WARNING, "Uploaded 
file size 0 - file [%s=%s] not saved", param, filename);

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to