diff --git a/NEWS b/NEWS
index 6ec3b242d..96a3c40bf 100644
--- a/NEWS
+++ b/NEWS
@@ -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
 
diff --git a/src/archive/plugins/ZzipArchivePlugin.cxx b/src/archive/plugins/ZzipArchivePlugin.cxx
index c4ebbd582..75fa81c37 100644
--- a/src/archive/plugins/ZzipArchivePlugin.cxx
+++ b/src/archive/plugins/ZzipArchivePlugin.cxx
@@ -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;
 }