From 8316d437fa55d4d537af1e1741f64898c7c0a9de Mon Sep 17 00:00:00 2001 From: Andrei Zmievski Date: Thu, 18 Mar 2010 21:07:38 +0000 Subject: [PATCH] Fix a few problems with large (2G-4G) file uploads. Added --enable-large-uploads-fix switch because one change was in SAPI.h structure. --- configure.in | 6 ++++++ ext/standard/file.c | 15 ++++++++------- main/SAPI.c | 4 ++-- main/SAPI.h | 4 ++++ main/rfc1867.c | 5 +++-- 5 files changed, 23 insertions(+), 11 deletions(-) diff --git a/configure.in b/configure.in index e48cadfa66..1f0622b1bb 100644 --- a/configure.in +++ b/configure.in @@ -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. diff --git a/ext/standard/file.c b/ext/standard/file.c index 6fd1a4d960..e877d4f21b 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -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; } diff --git a/main/SAPI.c b/main/SAPI.c index 443101dec3..f1c540b710 100644 --- a/main/SAPI.c +++ b/main/SAPI.c @@ -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", diff --git a/main/SAPI.h b/main/SAPI.h index b19195b3ad..2f5db36eff 100644 --- a/main/SAPI.h +++ b/main/SAPI.h @@ -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; diff --git a/main/rfc1867.c b/main/rfc1867.c index da4f3c6fda..ecb87545c6 100644 --- a/main/rfc1867.c +++ b/main/rfc1867.c @@ -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) -- 2.40.0