]> granicus.if.org Git - php/commitdiff
Fix a few problems with large (2G-4G) file uploads. Added
authorAndrei Zmievski <andrei@php.net>
Thu, 18 Mar 2010 21:07:38 +0000 (21:07 +0000)
committerAndrei Zmievski <andrei@php.net>
Thu, 18 Mar 2010 21:07:38 +0000 (21:07 +0000)
--enable-large-uploads-fix switch because one change was in SAPI.h structure.

configure.in
ext/standard/file.c
main/SAPI.c
main/SAPI.h
main/rfc1867.c

index e48cadfa66b4c650ca9775326616fb3aaa7d61fd..1f0622b1bbca6856f4df58c6e71cbd982c4d83f4 100644 (file)
@@ -896,6 +896,12 @@ else
   AC_MSG_RESULT([using system default])
 fi
 
+PHP_ARG_ENABLE(large-uploads-fix, whether to enable large files (2G-4G) uploads fix,
+[  --enable-large-uploads-fix Enable large files (2G-4G) uploads fix], no, no)
+if test "$PHP_LARGE_UPLOADS_FIX" = "yes"; then
+       AC_DEFINE(HAVE_LARGE_UPLOADS_FIX, 1, [Whether to enable large files (2G-4G) uploads fix])
+fi
+
 divert(5)
 
 dnl ## In diversion 5 we check which extensions should be compiled.
index 6fd1a4d9602ed436b0d12a6d920a1386df170d4d..e877d4f21b56c1737657e02e336e2b3087d59701 100644 (file)
@@ -579,7 +579,8 @@ PHP_FUNCTION(file_put_contents)
        char *filename;
        int filename_len;
        zval *data;
-       int numbytes = 0;
+       size_t numbytes = 0;
+       int result = SUCCESS;
        long flags = 0;
        zval *zcontext = NULL;
        php_stream_context *context = NULL;
@@ -622,7 +623,7 @@ PHP_FUNCTION(file_put_contents)
                case IS_RESOURCE: {
                        size_t len;
                        if (php_stream_copy_to_stream_ex(srcstream, stream, PHP_STREAM_COPY_ALL, &len) != SUCCESS) {
-                               numbytes = -1;
+                               result = FAILURE;
                        } else {
                                numbytes = len;
                        }
@@ -640,7 +641,7 @@ PHP_FUNCTION(file_put_contents)
                                numbytes = php_stream_write(stream, Z_STRVAL_P(data), Z_STRLEN_P(data));
                                if (numbytes != Z_STRLEN_P(data)) {
                                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Only %d of %d bytes written, possibly out of free disk space", numbytes, Z_STRLEN_P(data));
-                                       numbytes = -1;
+                                       result = FAILURE;
                                }
                        }
                        break;
@@ -666,7 +667,7 @@ PHP_FUNCTION(file_put_contents)
                                                        } else {
                                                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Only %d of %d bytes written, possibly out of free disk space",  bytes_written, Z_STRLEN_PP(tmp));
                                                        }
-                                                       numbytes = -1;
+                                                       result = FAILURE;
                                                        break;
                                                }
                                        }
@@ -683,19 +684,19 @@ PHP_FUNCTION(file_put_contents)
                                        numbytes = php_stream_write(stream, Z_STRVAL(out), Z_STRLEN(out));
                                        if (numbytes != Z_STRLEN(out)) {
                                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Only %d of %d bytes written, possibly out of free disk space", numbytes, Z_STRLEN(out));
-                                               numbytes = -1;
+                                               result = FAILURE;
                                        }
                                        zval_dtor(&out);
                                        break;
                                }
                        }
                default:
-                       numbytes = -1;          
+                       result = FAILURE;
                        break;
        }
        php_stream_close(stream);
 
-       if (numbytes < 0) {
+       if (result == FAILURE) {
                RETURN_FALSE;   
        }
 
index 443101dec3188b890be2260aabdf3582ec3929d3..f1c540b71065e7eb25d8f96c7cdb2fbb31e5a9f5 100644 (file)
@@ -191,8 +191,8 @@ static void sapi_read_post_data(TSRMLS_D)
 
 SAPI_API SAPI_POST_READER_FUNC(sapi_read_standard_form_data)
 {
-       int read_bytes;
-       int allocated_bytes=SAPI_POST_BLOCK_SIZE+1;
+       size_t read_bytes;
+       size_t allocated_bytes=SAPI_POST_BLOCK_SIZE+1;
 
        if (SG(request_info).content_length > SG(post_max_size)) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "POST Content-Length of %ld bytes exceeds the limit of %ld bytes",
index b19195b3ada794ef1592fc792395d56dbbf49b05..2f5db36eff712fdbb690dd55dcffbf26c39e0136 100644 (file)
@@ -118,7 +118,11 @@ typedef struct _sapi_globals_struct {
        void *server_context;
        sapi_request_info request_info;
        sapi_headers_struct sapi_headers;
+#ifdef HAVE_LARGE_UPLOADS_FIX
+       size_t read_post_bytes;
+#else
        int read_post_bytes;
+#endif
        unsigned char headers_sent;
        struct stat global_stat;
        char *default_mimetype;
index da4f3c6fda4c9ef23509e84f35d00e55bf73cd51..ecb87545c6346dfa3648bec7d0410a908a531de5 100644 (file)
@@ -765,8 +765,9 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) /* {{{ */
 {
        char *boundary, *s = NULL, *boundary_end = NULL, *start_arr = NULL, *array_index = NULL;
        char *temp_filename = NULL, *lbuf = NULL, *abuf = NULL;
-       int boundary_len = 0, total_bytes = 0, cancel_upload = 0, is_arr_upload = 0, array_len = 0;
-       int max_file_size = 0, skip_upload = 0, anonindex = 0, is_anonymous;
+       int boundary_len = 0, cancel_upload = 0, is_arr_upload = 0, array_len = 0;
+       int skip_upload = 0, anonindex = 0, is_anonymous;
+       size_t total_bytes = 0, max_file_size = 0;
        zval *http_post_files = NULL;
        HashTable *uploaded_files = NULL;
 #if HAVE_MBSTRING && !defined(COMPILE_DL_MBSTRING)