]> granicus.if.org Git - php/commitdiff
MFH: Fixed bug #48309 (stream_copy_to_stream() and fpasstru() do not
authorArnaud Le Blanc <lbarnaud@php.net>
Sun, 17 May 2009 14:58:10 +0000 (14:58 +0000)
committerArnaud Le Blanc <lbarnaud@php.net>
Sun, 17 May 2009 14:58:10 +0000 (14:58 +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 e8ee8bd152a30f5ffe0a5230d8d55ca94bfe801c..4b8d3568814a88b314471b32d15d48a0db77eff7 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 30ea7889be58baee2b02dabbb64370f2786dfed7..1e4ced33e1b5b1093a3fa657243f0b9737743be0 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 77a6b6e024a266ace1a400f0016789ebb13f870b..6bbe09be59c123688f397a5a39a471e07b6fa862 100755 (executable)
@@ -1215,12 +1215,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;
                }
@@ -1340,7 +1340,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;