]> granicus.if.org Git - php/commitdiff
refactor php_stream_temp_create{,_ex} and use it for the php://input stream
authorMichael Wallner <mike@php.net>
Wed, 2 Jul 2014 10:22:14 +0000 (12:22 +0200)
committerMichael Wallner <mike@php.net>
Thu, 3 Jul 2014 18:40:40 +0000 (20:40 +0200)
ext/standard/php_fopen_wrapper.c
main/php_memory_streams.h
main/streams/memory.c

index 7e21e95d1858c7de2d92da1f2535f01b7e0b286d..9628c0d69dddb31883c7f25dd123b47878e45f04 100644 (file)
@@ -231,7 +231,7 @@ php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, const char *pa
                if ((input->body = SG(request_info).request_body)) {
                        php_stream_rewind(input->body);
                } else {
-                       input->body = php_stream_temp_create(TEMP_STREAM_DEFAULT, SAPI_POST_BLOCK_SIZE);
+                       input->body = php_stream_temp_create_ex(TEMP_STREAM_DEFAULT, SAPI_POST_BLOCK_SIZE, PG(upload_tmp_dir));
                        SG(request_info).request_body = input->body;
                }
 
index 3c4c3280ebc229c716feff4813205a164d491bb1..32a3dae0dfe5840699b88cd83acd1f86532387d0 100644 (file)
@@ -35,7 +35,8 @@
 #define php_stream_memory_get_buffer(stream, length) _php_stream_memory_get_buffer((stream), (length) STREAMS_CC TSRMLS_CC)
 
 #define php_stream_temp_new() php_stream_temp_create(TEMP_STREAM_DEFAULT, PHP_STREAM_MAX_MEM)
-#define php_stream_temp_create(mode, max_memory_usage) _php_stream_temp_create((mode), (max_memory_usage) STREAMS_CC TSRMLS_CC)
+#define php_stream_temp_create(mode, max_memory_usage) php_stream_temp_create_ex((mode), (max_memory_usage), NULL)
+#define php_stream_temp_create_ex(mode, max_memory_usage, tmpdir) _php_stream_temp_create_ex((mode), (max_memory_usage), (tmpdir) STREAMS_CC TSRMLS_CC)
 #define php_stream_temp_create_rel(mode, max_memory_usage) _php_stream_temp_create((mode), (max_memory_usage) STREAMS_REL_CC TSRMLS_CC)
 #define php_stream_temp_open(mode, max_memory_usage, buf, length) _php_stream_temp_open((mode), (max_memory_usage), (buf), (length) STREAMS_CC TSRMLS_CC)
 
@@ -45,6 +46,7 @@ PHPAPI php_stream *_php_stream_memory_open(int mode, char *buf, size_t length ST
 PHPAPI char *_php_stream_memory_get_buffer(php_stream *stream, size_t *length STREAMS_DC TSRMLS_DC);
 
 PHPAPI php_stream *_php_stream_temp_create(int mode, size_t max_memory_usage STREAMS_DC TSRMLS_DC);
+PHPAPI php_stream *_php_stream_temp_create_ex(int mode, size_t max_memory_usage, const char *tmpdir STREAMS_DC TSRMLS_DC);
 PHPAPI php_stream *_php_stream_temp_open(int mode, size_t max_memory_usage, char *buf, size_t length STREAMS_DC TSRMLS_DC);
 END_EXTERN_C()
 
index 854b9e2720db494e4742bf80399b6fcf0530a9dc..6b3fc3f95bcd96c3ce8f4d84da3de6e4758dadf9 100644 (file)
@@ -352,6 +352,7 @@ typedef struct {
        size_t      smax;
        int                     mode;
        zval*       meta;
+       char*           tmpdir;
 } php_stream_temp_data;
 
 
@@ -369,7 +370,7 @@ static size_t php_stream_temp_write(php_stream *stream, const char *buf, size_t
                char *membuf = php_stream_memory_get_buffer(ts->innerstream, &memsize);
 
                if (memsize + count >= ts->smax) {
-                       php_stream *file = php_stream_fopen_tmpfile();
+                       php_stream *file = php_stream_fopen_temporary_file(ts->tmpdir, "php", NULL);
                        php_stream_write(file, membuf, memsize);
                        php_stream_free_enclosed(ts->innerstream, PHP_STREAM_FREE_CLOSE);
                        ts->innerstream = file;
@@ -420,6 +421,10 @@ static int php_stream_temp_close(php_stream *stream, int close_handle TSRMLS_DC)
                zval_ptr_dtor(&ts->meta);
        }
 
+       if (ts->tmpdir) {
+               efree(ts->tmpdir);
+       }
+
        efree(ts);
 
        return ret;
@@ -547,8 +552,8 @@ PHPAPI php_stream_ops       php_stream_temp_ops = {
 
 /* }}} */
 
-/* {{{ _php_stream_temp_create */
-PHPAPI php_stream *_php_stream_temp_create(int mode, size_t max_memory_usage STREAMS_DC TSRMLS_DC)
+/* {{{ _php_stream_temp_create_ex */
+PHPAPI php_stream *_php_stream_temp_create_ex(int mode, size_t max_memory_usage, const char *tmpdir STREAMS_DC TSRMLS_DC)
 {
        php_stream_temp_data *self;
        php_stream *stream;
@@ -556,7 +561,9 @@ PHPAPI php_stream *_php_stream_temp_create(int mode, size_t max_memory_usage STR
        self = ecalloc(1, sizeof(*self));
        self->smax = max_memory_usage;
        self->mode = mode;
-       self->meta = NULL;
+       if (tmpdir) {
+               self->tmpdir = estrdup(tmpdir);
+       }
        stream = php_stream_alloc_rel(&php_stream_temp_ops, self, 0, mode & TEMP_STREAM_READONLY ? "rb" : "w+b");
        stream->flags |= PHP_STREAM_FLAG_NO_BUFFER;
        self->innerstream = php_stream_memory_create_rel(mode);