]> 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:59:24 +0000 (14:59 +0000)
committerArnaud Le Blanc <lbarnaud@php.net>
Sun, 17 May 2009 14:59:24 +0000 (14:59 +0000)
update stream position of plain files)

NEWS
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/NEWS b/NEWS
index 0542c47e5ce9ee4b2c76f92bc71ab0750d02c117..4ae3c6c1476689302f9df5c5e6543d272731ff0a 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -16,6 +16,8 @@ PHP                                                                        NEWS
 - Fixed segfault on invalid session.save_path. (Hannes)
 - Fixed leaks in imap when a mail_criteria is used. (Pierre)
 
+- Fixed bug #48309 (stream_copy_to_stream() and fpasstru() do not update stream
+  position of plain files). (Arnaud)
 - Fixed bug #48307 (stream_copy_to_stream() copies 0 bytes when $source is a 
   socket). (Arnaud)
 - Fixed bug #48256 (Crash due to double-linking of history.o).
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 f2c698b4f0f854a71861993120e82285535324f1..dfbfce0763cadbc4d0f4c1f1ef92157f1de5d221 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 a4b48370ac65f364c6f6c77111e146f784269e0d..1e224e4f7c97b3b33c58abf7a2664aa6a58d6c24 100755 (executable)
@@ -1206,12 +1206,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;
                }
@@ -1331,7 +1331,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;