diff options
Diffstat (limited to 'lib/Support/Compressor.cpp')
-rw-r--r-- | lib/Support/Compressor.cpp | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/lib/Support/Compressor.cpp b/lib/Support/Compressor.cpp index d2dc5e50ab..e0f5f29aad 100644 --- a/lib/Support/Compressor.cpp +++ b/lib/Support/Compressor.cpp @@ -408,7 +408,8 @@ size_t Compressor::decompress(const char *in, size_t size, // Decompress it int bzerr = BZ_OK; - while (BZ_OK == (bzerr = BZ2_bzDecompress(&bzdata))) { + while ( BZ_OK == (bzerr = BZ2_bzDecompress(&bzdata)) && + bzdata.avail_in != 0 ) { if (0 != getdata_uns(bzdata.next_out, bzdata.avail_out,cb,context)) { BZ2_bzDecompressEnd(&bzdata); throw std::string("Can't allocate output buffer"); @@ -420,11 +421,12 @@ size_t Compressor::decompress(const char *in, size_t size, case BZ_MEM_ERROR: throw std::string("Out of memory"); case BZ_DATA_ERROR: throw std::string("Data integrity error"); case BZ_DATA_ERROR_MAGIC:throw std::string("Data is not BZIP2"); + case BZ_OK: throw std::string("Insufficient input for bzip2"); + case BZ_STREAM_END: break; default: throw("Ooops"); - case BZ_STREAM_END: - break; } + // Finish result = bzdata.total_out_lo32; if (sizeof(size_t) == sizeof(uint64_t)) @@ -474,7 +476,7 @@ Compressor::decompressToStream(const char*in, size_t size, std::ostream& out){ // Set up the context and writer WriterContext ctxt(&out,size / 2); - // Compress everything after the magic number (which we'll alter) + // Decompress everything after the magic number (which we'll alter) size_t zipSize = Compressor::decompress(in,size, WriterContext::callback, (void*)&ctxt); |