summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.in6
-rw-r--r--ext/standard/file.c15
-rw-r--r--main/SAPI.c4
-rw-r--r--main/SAPI.h4
-rw-r--r--main/rfc1867.c5
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)