From 3ce18aa852c07aa2b9bf14200d701f298f7219d2 Mon Sep 17 00:00:00 2001 From: Hannes Magnusson Date: Mon, 20 Dec 2010 11:00:27 +0000 Subject: [PATCH] Fixed bug#53579 (stream_get_contents() segfaults on ziparchive streams) Also added the filename being access to the stream_get_meta_data() array --- NEWS | 2 ++ ext/zip/tests/bug53579.phpt | 44 +++++++++++++++++++++++++++++++++++++ ext/zip/zip_stream.c | 1 + 3 files changed, 47 insertions(+) create mode 100644 ext/zip/tests/bug53579.phpt diff --git a/NEWS b/NEWS index aa55786525..849d9ddb80 100644 --- a/NEWS +++ b/NEWS @@ -81,8 +81,10 @@ . Fixed memory leaked introduced by the NULL poisoning patch (Mateusz Kocielski, Pierre) - Zip extension: + . Added the filename into the return value of stream_get_meta_data(). (Hannes) . Fixed bug #53568 (swapped memset arguments in struct initialization). (crrodriguez at opensuse dot org) + . Fixed bug #53579 (stream_get_contents() segfaults on ziparchive streams) (Hannes) 09 Dec 2010, PHP 5.3.4 - Upgraded bundled Sqlite3 to version 3.7.3. (Ilia) diff --git a/ext/zip/tests/bug53579.phpt b/ext/zip/tests/bug53579.phpt new file mode 100644 index 0000000000..1d533303b5 --- /dev/null +++ b/ext/zip/tests/bug53579.phpt @@ -0,0 +1,44 @@ +--TEST-- +Bug #53579 (stream_get_contents() segfaults on ziparchive streams) +--SKIPIF-- + +--FILE-- +open($file)) { + exit('failed'); +} +$fp = $zip->getStream('foo'); + +var_dump($fp); +if(!$fp) exit("\n"); +$contents = stream_get_contents($fp); + +fclose($fp); +$zip->close(); +var_dump($contents); + + +$fp = fopen('zip://' . dirname(__FILE__) . '/test_with_comment.zip#foo', 'rb'); +if (!$fp) { + exit("cannot open\n"); +} +$contents = stream_get_contents($fp); +var_dump($contents); +fclose($fp); + +?> +--EXPECTF-- +resource(%d) of type (stream) +string(5) "foo + +" +string(5) "foo + +" diff --git a/ext/zip/zip_stream.c b/ext/zip/zip_stream.c index 7ba365424f..dad09233e7 100644 --- a/ext/zip/zip_stream.c +++ b/ext/zip/zip_stream.c @@ -216,6 +216,7 @@ php_stream *php_stream_zip_open(char *filename, char *path, char *mode STREAMS_D self->stream = NULL; self->cursor = 0; stream = php_stream_alloc(&php_stream_zipio_ops, self, NULL, mode); + stream->orig_path = estrdup(path); } else { zip_close(stream_za); } -- 2.40.0