aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--modules/comp_bzip2/bzip2.cpp17
1 files changed, 14 insertions, 3 deletions
diff --git a/modules/comp_bzip2/bzip2.cpp b/modules/comp_bzip2/bzip2.cpp
index 32e60c0d2..712dacd7d 100644
--- a/modules/comp_bzip2/bzip2.cpp
+++ b/modules/comp_bzip2/bzip2.cpp
@@ -173,10 +173,13 @@ Bzip_Decompression::Bzip_Decompression(bool s) :
/*************************************************
* Decompress Input with Bzip *
*************************************************/
-void Bzip_Decompression::write(const byte input[], u32bit length)
+void Bzip_Decompression::write(const byte input_arr[], u32bit length)
{
if(length) no_writes = false;
- bz->stream.next_in = reinterpret_cast<char*>(const_cast<byte*>(input));
+
+ char* input = reinterpret_cast<char*>(const_cast<byte*>(input_arr));
+
+ bz->stream.next_in = input;
bz->stream.avail_in = length;
while(bz->stream.avail_in != 0)
@@ -185,6 +188,7 @@ void Bzip_Decompression::write(const byte input[], u32bit length)
bz->stream.avail_out = buffer.size();
int rc = BZ2_bzDecompress(&(bz->stream));
+
if(rc != BZ_OK && rc != BZ_STREAM_END)
{
clear();
@@ -196,12 +200,14 @@ void Bzip_Decompression::write(const byte input[], u32bit length)
throw Exception("Bzip_Decompression: Memory allocation error");
throw Exception("Bzip_Decompression: Unknown decompress error");
}
+
send(buffer, buffer.size() - bz->stream.avail_out);
+
if(rc == BZ_STREAM_END)
{
u32bit read_from_block = length - bz->stream.avail_in;
start_msg();
- bz->stream.next_in = reinterpret_cast<char*>(const_cast<byte*>(input)) + read_from_block;
+ bz->stream.next_in = input + read_from_block;
bz->stream.avail_in = length - read_from_block;
input += read_from_block;
length -= read_from_block;
@@ -216,8 +222,10 @@ void Bzip_Decompression::start_msg()
{
clear();
bz = new Bzip_Stream;
+
if(BZ2_bzDecompressInit(&(bz->stream), 0, small_mem) != BZ_OK)
throw Exception("Bzip_Decompression: Memory allocation error");
+
no_writes = true;
}
@@ -236,13 +244,16 @@ void Bzip_Decompression::end_msg()
bz->stream.next_out = reinterpret_cast<char*>(buffer.begin());
bz->stream.avail_out = buffer.size();
rc = BZ2_bzDecompress(&(bz->stream));
+
if(rc != BZ_OK && rc != BZ_STREAM_END)
{
clear();
throw Exception("Bzip_Decompression: Error finalizing decompression");
}
+
send(buffer, buffer.size() - bz->stream.avail_out);
}
+
clear();
}