diff --git a/ext/standard/tests/streams/temp_stream_seek.phpt b/ext/standard/tests/streams/temp_stream_seek.phpt new file mode 100644 index 0000000000000..821c6b2784d7d --- /dev/null +++ b/ext/standard/tests/streams/temp_stream_seek.phpt @@ -0,0 +1,20 @@ +--TEST-- +BUG: php://temp does not preserve file-pointer once it switches from memory to temporary file +--FILE-- + +--EXPECT-- +string(16) "2222222222222222" +int(738) diff --git a/main/streams/memory.c b/main/streams/memory.c index 0def3b1a3d752..3d09d6d086ccc 100644 --- a/main/streams/memory.c +++ b/main/streams/memory.c @@ -375,10 +375,11 @@ static ssize_t php_stream_temp_write(php_stream *stream, const char *buf, size_t return -1; } if (php_stream_is(ts->innerstream, PHP_STREAM_IS_MEMORY)) { - size_t memsize; - char *membuf = php_stream_memory_get_buffer(ts->innerstream, &memsize); - - if (memsize + count >= ts->smax) { + zend_off_t pos = php_stream_tell(ts->innerstream); + + if (pos + count >= ts->smax) { + size_t memsize; + char *membuf = php_stream_memory_get_buffer(ts->innerstream, &memsize); php_stream *file = php_stream_fopen_temporary_file(ts->tmpdir, "php", NULL); if (file == NULL) { php_error_docref(NULL, E_WARNING, "Unable to create temporary file, Check permissions in temporary files directory."); @@ -388,6 +389,7 @@ static ssize_t php_stream_temp_write(php_stream *stream, const char *buf, size_t php_stream_free_enclosed(ts->innerstream, PHP_STREAM_FREE_CLOSE); ts->innerstream = file; php_stream_encloses(stream, ts->innerstream); + php_stream_seek(ts->innerstream, pos, SEEK_SET); } } return php_stream_write(ts->innerstream, buf, count);