]> granicus.if.org Git - php/commitdiff
- [DOC] Reverted rev #304382 and rev #304380, as I figured out a way to
authorGustavo André dos Santos Lopes <cataphract@php.net>
Thu, 14 Oct 2010 03:15:15 +0000 (03:15 +0000)
committerGustavo André dos Santos Lopes <cataphract@php.net>
Thu, 14 Oct 2010 03:15:15 +0000 (03:15 +0000)
  fix the erratic behavior without breaking backwards compatibility. Namely,
  $offset retains SEEK_SET behavior but actually SEEK_CUR is passed to
  _php_stream_seek, if possible, by moving the offset stream->position bytes.
- Addresses bug #53006.

ext/standard/streamsfuncs.c
ext/standard/tests/streams/bug46426.phpt
ext/standard/tests/streams/stream_get_contents_001.phpt

index a01c58c3fea454606f722043811897858d5009f9..0ed8e10e6da13d92b37e496908b8caaf6ebcf378 100644 (file)
@@ -415,7 +415,7 @@ PHP_FUNCTION(stream_get_contents)
 {
        php_stream *stream;
        zval *zsrc;
-       long maxlen = PHP_STREAM_COPY_ALL, pos = 0;
+       long maxlen = PHP_STREAM_COPY_ALL, pos = -1L;
        int len, newlen;
        char *contents = NULL;
 
@@ -425,12 +425,19 @@ PHP_FUNCTION(stream_get_contents)
 
        php_stream_from_zval(stream, &zsrc);
 
-       if ((pos > 0L) && php_stream_seek(stream, pos, SEEK_CUR) < 0) {
-               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to seek %ld bytes from current position in the stream", pos);
-               RETURN_FALSE;
-       } else if (pos < 0L) {
-               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of bytes to seek must be non-negative, given %ld", pos);
-               RETURN_FALSE;
+       if (pos >= 0) {
+               int seek_res = 0;
+               if (pos > stream->position) {
+                       /* use SEEK_CUR to allow emulation in streams that don't support seeking */
+                       seek_res = php_stream_seek(stream, pos - stream->position, SEEK_CUR);
+               } else if (pos < stream->position)  {
+                       seek_res = php_stream_seek(stream, pos, SEEK_SET);
+               }
+
+               if (seek_res != 0) {
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to seek to position %ld in the stream", pos);
+                       RETURN_FALSE;
+               }
        }
 
        len = php_stream_copy_to_mem(stream, &contents, maxlen, 0);
index cd3c3254eff41ff05ce2e7d634b54b32892821a0..80dbcded800028e9e1e5b104af5eca0bdd016e15 100644 (file)
@@ -7,23 +7,19 @@ $tmp = tmpfile();
 
 fwrite($tmp, b"12345");
 
-fseek($tmp, 0);
-echo stream_get_contents($tmp, 2, 1); //23
+echo stream_get_contents($tmp, 2, 1);
 echo "\n";
-echo stream_get_contents($tmp, -1); //45
+echo stream_get_contents($tmp, -1);
 echo "\n";
-fseek($tmp, -1, SEEK_CUR);
-echo stream_get_contents($tmp, -1, 0); //5
+echo stream_get_contents($tmp, -1, 0);
 echo "\n";
-fseek($tmp, 0);
-echo stream_get_contents($tmp, -1, 2); //345
+echo stream_get_contents($tmp, -1, 2);
 echo "\n";
-fseek($tmp, 0);
-echo stream_get_contents($tmp, 0, 0); //""
+echo stream_get_contents($tmp, 0, 0);
 echo "\n";
-echo stream_get_contents($tmp, 1, 0); //1
+echo stream_get_contents($tmp, 1, 0);
 echo "\n";
-echo stream_get_contents($tmp, -1); //2345
+echo stream_get_contents($tmp, -1);
 
 @unlink($tmp);
 
@@ -31,7 +27,7 @@ echo stream_get_contents($tmp, -1); //2345
 --EXPECT--
 23
 45
-5
+12345
 345
 
 1
index 0b7db1fbcb565ae3d8ff84df6e9e3e21a16ed8bd..e8e1c3d26bda39d1b50d9c578e68e77f921027dc 100644 (file)
@@ -9,17 +9,14 @@ fwrite($tmp, b"12345");
 
 echo stream_get_contents($tmp, 2, 5), "--\n";
 echo stream_get_contents($tmp, 2), "--\n";
-fseek($tmp, 0);
 echo stream_get_contents($tmp, 2, 3), "--\n";
 echo stream_get_contents($tmp, 2, -1), "--\n";
 
 @unlink($tmp);
 
 ?>
---EXPECTF--
+--EXPECT--
 --
 --
 45--
-
-Warning: stream_get_contents(): Number of bytes to seek must be non-negative, given -1 in %s on line %d
 --