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
This commit is contained in:
Max Kellermann 2020-09-04 14:11:33 +02:00
parent e44b953d9a
commit 1f6a7d6462
2 changed files with 9 additions and 0 deletions

2
NEWS
View File

@ -2,6 +2,8 @@ ver 0.21.26 (not yet released)
* output
- osx: fix crash bug
- sles: support floating point samples
* archive
- zzip: fix crash on corrupt ZIP file
* decoder
- sndfile: fix lost samples at end of file

View File

@ -32,6 +32,8 @@
#include <zzip/zzip.h>
#include <inttypes.h> /* for PRIoffset (PRIu64) */
struct ZzipDir {
ZZIP_DIR *const dir;
@ -151,6 +153,11 @@ ZzipInputStream::Read(void *ptr, size_t read_size)
if (nbytes < 0)
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);
return nbytes;
}