]> granicus.if.org Git - php/commitdiff
Ensure that the stream position is kept between reads
authorKalle Sommer Nielsen <kalle@php.net>
Thu, 13 Jul 2017 23:59:23 +0000 (01:59 +0200)
committerKalle Sommer Nielsen <kalle@php.net>
Thu, 13 Jul 2017 23:59:23 +0000 (01:59 +0200)
ext/exif/exif.c
ext/exif/tests/exif_read_data_streams_seek.phpt [new file with mode: 0644]

index 7558374291749e3c42384cd72c19aeb7f6330116..9ac323e1d63116c8ab02e6621a05ed6f79b8df32 100644 (file)
@@ -4305,9 +4305,9 @@ static int exif_discard_imageinfo(image_info_type *ImageInfo)
 }
 /* }}} */
 
-/* {{{ exif_read_from_stream
+/* {{{ exif_read_from_impl
  */
-static int exif_read_from_stream(image_info_type *ImageInfo, php_stream *stream, int read_thumbnail, int read_all)
+static int exif_read_from_impl(image_info_type *ImageInfo, php_stream *stream, int read_thumbnail, int read_all)
 {
        int ret;
        zend_stat_t st;
@@ -4368,6 +4368,27 @@ static int exif_read_from_stream(image_info_type *ImageInfo, php_stream *stream,
 }
 /* }}} */
 
+/* {{{ exif_read_from_stream
+ */
+static int exif_read_from_stream(image_info_type *ImageInfo, php_stream *stream, int read_thumbnail, int read_all)
+{
+       int ret;
+       off_t old_pos = php_stream_tell(stream);
+
+       if (old_pos) {
+               php_stream_seek(stream, 0, SEEK_SET);
+       }
+
+       ret = exif_read_from_impl(ImageInfo, stream, read_thumbnail, read_all);
+
+       if (old_pos) {
+               php_stream_seek(stream, old_pos, SEEK_SET);
+       }
+
+       return ret;
+}
+/* }}} */
+
 /* {{{ exif_read_from_file
  */
 static int exif_read_from_file(image_info_type *ImageInfo, char *FileName, int read_thumbnail, int read_all)
diff --git a/ext/exif/tests/exif_read_data_streams_seek.phpt b/ext/exif/tests/exif_read_data_streams_seek.phpt
new file mode 100644 (file)
index 0000000..e3b2c99
--- /dev/null
@@ -0,0 +1,21 @@
+--TEST--
+exif_read_data() with streams test
+--SKIPIF--
+<?php if (!extension_loaded('exif')) print 'skip exif extension not available';?>
+--INI--
+output_handler=
+zlib.output_compression=0
+--FILE--
+<?php
+$fp = fopen(__DIR__ . '/image027.tiff', 'rb');
+
+fseek($fp, 100, SEEK_SET);
+
+exif_read_data($fp);
+
+var_dump(ftell($fp) === 100);
+
+fclose($fp);
+?>
+--EXPECT--
+bool(true)