Commit 1f6a7d64 authored by Max Kellermann's avatar Max Kellermann

archive/zzip: fix crash on corrupt ZIP file

Sometimes, zzip_file_read() returns 0 even though the end of the file was not reached. This causes assertion failures in DecoderBridge::Read(). Closes https://github.com/MusicPlayerDaemon/MPD/issues/935
parent e44b953d
...@@ -2,6 +2,8 @@ ver 0.21.26 (not yet released) ...@@ -2,6 +2,8 @@ ver 0.21.26 (not yet released)
* output * output
- osx: fix crash bug - osx: fix crash bug
- sles: support floating point samples - sles: support floating point samples
* archive
- zzip: fix crash on corrupt ZIP file
* decoder * decoder
- sndfile: fix lost samples at end of file - sndfile: fix lost samples at end of file
......
...@@ -32,6 +32,8 @@ ...@@ -32,6 +32,8 @@
#include <zzip/zzip.h> #include <zzip/zzip.h>
#include <inttypes.h> /* for PRIoffset (PRIu64) */
struct ZzipDir { struct ZzipDir {
ZZIP_DIR *const dir; ZZIP_DIR *const dir;
...@@ -151,6 +153,11 @@ ZzipInputStream::Read(void *ptr, size_t read_size) ...@@ -151,6 +153,11 @@ ZzipInputStream::Read(void *ptr, size_t read_size)
if (nbytes < 0) if (nbytes < 0)
throw std::runtime_error("zzip_file_read() has failed"); throw std::runtime_error("zzip_file_read() has failed");
if (nbytes == 0 && !IsEOF())
throw FormatRuntimeError("Unexpected end of file %s"
" at %" PRIoffset " of %" PRIoffset,
GetURI(), GetOffset(), GetSize());
offset = zzip_tell(file); offset = zzip_tell(file);
return nbytes; return nbytes;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment