]> granicus.if.org Git - php/commitdiff
- Do not violate php_stream abstraction and use php_stream_tell instead of accessing...
authorGustavo André dos Santos Lopes <cataphract@php.net>
Thu, 30 Dec 2010 19:00:19 +0000 (19:00 +0000)
committerGustavo André dos Santos Lopes <cataphract@php.net>
Thu, 30 Dec 2010 19:00:19 +0000 (19:00 +0000)
#Should have no behavior changes.

ext/standard/streamsfuncs.c

index b15d3efef755e006997470574b1c95358a71f5d8..2b7ffae9d16e462a9e687e09116c8ca8857d6dbe 100644 (file)
@@ -413,29 +413,36 @@ PHP_FUNCTION(stream_socket_recvfrom)
    Reads all remaining bytes (or up to maxlen bytes) from a stream and returns them as a string. */
 PHP_FUNCTION(stream_get_contents)
 {
-       php_stream *stream;
-       zval *zsrc;
-       long maxlen = PHP_STREAM_COPY_ALL, pos = -1L;
-       int len, newlen;
-       char *contents = NULL;
-
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|ll", &zsrc, &maxlen, &pos) == FAILURE) {
+       php_stream      *stream;
+       zval            *zsrc;
+       long            maxlen          = PHP_STREAM_COPY_ALL,
+                               desiredpos      = -1L;
+       int                     len,
+                               newlen;
+       char            *contents       = NULL;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|ll", &zsrc, &maxlen, &desiredpos) == FAILURE) {
                RETURN_FALSE;
        }
 
        php_stream_from_zval(stream, &zsrc);
 
-       if (pos >= 0) {
-               int seek_res = 0;
-               if (pos > stream->position) {
+       if (desiredpos >= 0) {
+               int             seek_res = 0;
+               off_t   position;
+
+               position = php_stream_tell(stream);
+               if (position >= 0 && desiredpos > 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);
+                       seek_res = php_stream_seek(stream, desiredpos - position, SEEK_CUR);
+               } else if (desiredpos < position)  {
+                       /* desired position before position or error on tell */
+                       seek_res = php_stream_seek(stream, desiredpos, SEEK_SET);
                }
 
                if (seek_res != 0) {
-                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to seek to position %ld in the stream", pos);
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING,
+                               "Failed to seek to position %ld in the stream", desiredpos);
                        RETURN_FALSE;
                }
        }