From e006ad5671f1025b5d7e29499c21c6d675926eee Mon Sep 17 00:00:00 2001 From: Jakub Zelenka Date: Sat, 23 Sep 2023 21:03:31 +0100 Subject: [PATCH] Fix bug #75708: getimagesize with "&$imageinfo" fails on StreamWrappers Closes GH-12444 --- ext/standard/image.c | 16 ++++++- ext/standard/tests/image/bug75708.jpg | Bin 0 -> 34619 bytes ext/standard/tests/image/bug75708.phpt | 56 +++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 ext/standard/tests/image/bug75708.jpg create mode 100644 ext/standard/tests/image/bug75708.phpt diff --git a/ext/standard/image.c b/ext/standard/image.c index 85ecda2f3d70b..5200295f3af28 100644 --- a/ext/standard/image.c +++ b/ext/standard/image.c @@ -425,6 +425,20 @@ static int php_skip_variable(php_stream * stream) } /* }}} */ +static size_t php_read_stream_all_chunks(php_stream *stream, char *buffer, size_t length) +{ + size_t read_total = 0; + do { + ssize_t read_now = php_stream_read(stream, buffer, length - read_total); + read_total += read_now; + if (read_now < stream->chunk_size && read_total != length) { + return 0; + } + } while (read_total < length); + + return read_total; +} + /* {{{ php_read_APP */ static int php_read_APP(php_stream * stream, unsigned int marker, zval *info) { @@ -441,7 +455,7 @@ static int php_read_APP(php_stream * stream, unsigned int marker, zval *info) buffer = emalloc(length); - if (php_stream_read(stream, buffer, (size_t) length) != length) { + if (php_read_stream_all_chunks(stream, buffer, length) != length) { efree(buffer); return 0; } diff --git a/ext/standard/tests/image/bug75708.jpg b/ext/standard/tests/image/bug75708.jpg new file mode 100644 index 0000000000000000000000000000000000000000..26cb754fab10a47209ad1a252d2a6f7c5631c60d GIT binary patch literal 34619 zcmeHw37Dm2b>?4HUA;F{Lp2~m_^C!|vG%R2DmIY^%#a+4^ z#z-I{(ocM%(HM0mA}uDGF(x|V5@*CM(Wo=yj;IrZI%15O5SNH3)Vyc?zT1mQQ0K`r z>4NIIb??7?-#PDj&wI}I-CK)aT>P7)>)BWAydr7CS8rQyk}N*hb;gb(rI{qzx%0AQ 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 W>I4II>1<%2&0X)j{hrN>5By&wp=$X6 literal 0 HcmV?d00001 diff --git a/ext/standard/tests/image/bug75708.phpt b/ext/standard/tests/image/bug75708.phpt new file mode 100644 index 0000000000000..956a99b6af6b8 --- /dev/null +++ b/ext/standard/tests/image/bug75708.phpt @@ -0,0 +1,56 @@ +--TEST-- +Bug #75708 (getimagesize with "&$imageinfo" fails on StreamWrappers) +--FILE-- +handle = fopen(str_replace('fs://', __DIR__ . '/', $file), $mode); + return true; + } + function stream_read($count) { + return fread($this->handle, $count); + } + function stream_eof() { + return feof($this->handle); + } + function stream_seek($offset, $whence) { + return fseek($this->handle, $offset, $whence) === 0; + } + function stream_stat() { + return fstat($this->handle); + } + function url_stat($file) { + return stat(str_replace('fs://', '', $file)); + } + function stream_tell() { + return ftell($this->handle); + } + function stream_close() { + fclose($this->handle); + } +} + +stream_register_wrapper('fs', 'FSStreamWrapper'); + +var_dump(getimagesize('fs://bug75708.jpg', $info)); + +?> +--EXPECT-- +array(7) { + [0]=> + int(10) + [1]=> + int(10) + [2]=> + int(2) + [3]=> + string(22) "width="10" height="10"" + ["bits"]=> + int(8) + ["channels"]=> + int(3) + ["mime"]=> + string(10) "image/jpeg" +} +