]> granicus.if.org Git - php/commitdiff
Fixed bug #48309 (stream_copy_to_stream() and fpasstru() do not
authorArnaud Le Blanc <lbarnaud@php.net>
Sun, 17 May 2009 14:57:05 +0000 (14:57 +0000)
committerArnaud Le Blanc <lbarnaud@php.net>
Sun, 17 May 2009 14:57:05 +0000 (14:57 +0000)
update stream position of plain files)

ext/standard/tests/streams/bug48309.phpt [new file with mode: 0644]
main/streams/mmap.c
main/streams/php_stream_mmap.h
main/streams/streams.c

diff --git a/ext/standard/tests/streams/bug48309.phpt b/ext/standard/tests/streams/bug48309.phpt
new file mode 100644 (file)
index 0000000..d347cc3
--- /dev/null
@@ -0,0 +1,33 @@
+--TEST--
+Bug #48309 (stream_copy_to_stream() and fpasstru() do not update stream position)
+--FILE--
+<?php
+
+$tmp = tmpfile();
+fwrite($tmp, b'test');
+fseek($tmp, 0, SEEK_SET);
+
+echo "-- stream_copy_to_stream() --\n";
+
+fseek($tmp, 0, SEEK_SET);
+stream_copy_to_stream($tmp, STDOUT, 2);
+
+echo "\n";
+var_dump(stream_get_contents($tmp));
+
+echo "-- fpassthru() --\n";
+
+fseek($tmp, 0, SEEK_SET);
+fpassthru($tmp);
+
+echo "\n";
+var_dump(stream_get_contents($tmp));
+
+?>
+--EXPECTF--
+-- stream_copy_to_stream() --
+te
+string(2) "st"
+-- fpassthru() --
+test
+string(0) ""
index 70ef88239997ea90570a3754f217fd24a36b7517..ae34e7115f515565ab7cfb5ac2140c55b8170455 100644 (file)
@@ -51,6 +51,20 @@ PHPAPI int _php_stream_mmap_unmap(php_stream *stream TSRMLS_DC)
        return php_stream_set_option(stream, PHP_STREAM_OPTION_MMAP_API, PHP_STREAM_MMAP_UNMAP, NULL) == PHP_STREAM_OPTION_RETURN_OK ? 1 : 0;
 }
 
+PHPAPI int _php_stream_mmap_unmap_ex(php_stream *stream, off_t readden TSRMLS_DC)
+{
+       int ret = 1;
+
+       if (php_stream_seek(stream, readden, SEEK_CUR) != 0) {
+               ret = 0;
+       }
+       if (php_stream_mmap_unmap(stream) == 0) {
+               ret = 0;
+       }
+
+       return ret;
+}
+
 /*
  * Local variables:
  * tab-width: 4
index efa963e7c9776b7d471c3a025549e30c057826d0..7d0543b8f475ae8e1cd76eb0d07e288d831c5144 100644 (file)
@@ -58,6 +58,8 @@ typedef struct {
 
 } php_stream_mmap_range;
 
+#define PHP_STREAM_MMAP_ALL 0
+
 #define php_stream_mmap_supported(stream)      (_php_stream_set_option((stream), PHP_STREAM_OPTION_MMAP_API, PHP_STREAM_MMAP_SUPPORTED, NULL TSRMLS_CC) == 0 ? 1 : 0)
 
 /* Returns 1 if the stream in its current state can be memory mapped,
@@ -71,6 +73,9 @@ PHPAPI char *_php_stream_mmap_range(php_stream *stream, size_t offset, size_t le
 /* un-maps the last mapped range */
 PHPAPI int _php_stream_mmap_unmap(php_stream *stream TSRMLS_DC);
 #define php_stream_mmap_unmap(stream)                          _php_stream_mmap_unmap((stream) TSRMLS_CC)
+
+PHPAPI int _php_stream_mmap_unmap_ex(php_stream *stream, off_t readden TSRMLS_DC);
+#define php_stream_mmap_unmap_ex(stream, readden)                      _php_stream_mmap_unmap_ex((stream), (readden) TSRMLS_CC)
 END_EXTERN_C()
 
 /*
index e953a1690f70066752ee69be0e1512bbbbe5a68e..caab99f92f05427308ed5cdd89803a3f4ed9666d 100755 (executable)
@@ -1603,12 +1603,12 @@ PHPAPI size_t _php_stream_passthru(php_stream * stream STREAMS_DC TSRMLS_DC)
                char *p;
                size_t mapped;
 
-               p = php_stream_mmap_range(stream, php_stream_tell(stream), PHP_STREAM_COPY_ALL, PHP_STREAM_MAP_MODE_SHARED_READONLY, &mapped);
+               p = php_stream_mmap_range(stream, php_stream_tell(stream), PHP_STREAM_MMAP_ALL, PHP_STREAM_MAP_MODE_SHARED_READONLY, &mapped);
 
                if (p) {
                        PHPWRITE(p, mapped);
 
-                       php_stream_mmap_unmap(stream);
+                       php_stream_mmap_unmap_ex(stream, mapped);
 
                        return mapped;
                }
@@ -1916,7 +1916,7 @@ PHPAPI size_t _php_stream_copy_to_stream_ex(php_stream *src, php_stream *dest, s
                if (p) {
                        mapped = php_stream_write(dest, p, mapped);
 
-                       php_stream_mmap_unmap(src);
+                       php_stream_mmap_unmap_ex(src, mapped);
 
                        *len = mapped;