You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by dc...@apache.org on 2012/09/13 23:20:34 UTC

svn commit: r1384540 - in /avro/trunk: CHANGES.txt lang/c/src/codec.c lang/c/src/datafile.c

Author: dcreager
Date: Thu Sep 13 21:20:34 2012
New Revision: 1384540

URL: http://svn.apache.org/viewvc?rev=1384540&view=rev
Log:
AVRO-1158. C: Fix infinite loop in delate codec decompression.

Contributed by Lucas Martin-King.

Modified:
    avro/trunk/CHANGES.txt
    avro/trunk/lang/c/src/codec.c
    avro/trunk/lang/c/src/datafile.c

Modified: avro/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/avro/trunk/CHANGES.txt?rev=1384540&r1=1384539&r2=1384540&view=diff
==============================================================================
--- avro/trunk/CHANGES.txt (original)
+++ avro/trunk/CHANGES.txt Thu Sep 13 21:20:34 2012
@@ -61,6 +61,9 @@ Avro 1.7.2 (unreleased)
     AVRO-1154. Java: Fix NettyTransciever to not hang when the server
     is stopped. (Karel Vervaeke & Bruno Dumon via cutting)
 
+    AVRO-1158. C: Fixed infinite loop in deflate decompression codec.
+    (Lucas Martin-King via dcreager)
+
 Avro 1.7.1 (16 July 2012)
 
   NEW FEATURES

Modified: avro/trunk/lang/c/src/codec.c
URL: http://svn.apache.org/viewvc/avro/trunk/lang/c/src/codec.c?rev=1384540&r1=1384539&r2=1384540&view=diff
==============================================================================
--- avro/trunk/lang/c/src/codec.c (original)
+++ avro/trunk/lang/c/src/codec.c Thu Sep 13 21:20:34 2012
@@ -207,6 +207,14 @@ static int decode_deflate(avro_codec_t c
 	{
 		err = inflate(s, Z_FINISH);
 
+		// Apparently if there is yet available space in the output then something
+		// has gone wrong in decompressing the data (according to cpython zlibmodule.c)
+		if (err == Z_BUF_ERROR && s->avail_out > 0) {
+			inflateEnd(s);
+			avro_set_error("Error decompressing block with deflate, possible data error");
+			return 1;
+		}
+
 		// The buffer was not big enough. resize it.
 		if (err == Z_BUF_ERROR)
 		{
@@ -229,6 +237,7 @@ static int decode_deflate(avro_codec_t c
 	c->used_size = s->total_out;
 
 	if (inflateReset(s) != Z_OK) {
+		avro_set_error("Error resetting deflate decompression");
 		return 1;
 	}
 

Modified: avro/trunk/lang/c/src/datafile.c
URL: http://svn.apache.org/viewvc/avro/trunk/lang/c/src/datafile.c?rev=1384540&r1=1384539&r2=1384540&view=diff
==============================================================================
--- avro/trunk/lang/c/src/datafile.c (original)
+++ avro/trunk/lang/c/src/datafile.c Thu Sep 13 21:20:34 2012
@@ -453,7 +453,8 @@ static int file_read_block_count(avro_fi
 	check_prefix(rval, avro_read(r->reader, r->current_blockdata, len),
 		     "Cannot read file block: ");
 
-	avro_codec_decode(r->codec, r->current_blockdata, len);
+	check_prefix(rval, avro_codec_decode(r->codec, r->current_blockdata, len),
+		     "Cannot decode file block: ");
 
 	avro_reader_memory_set_source(r->block_reader, (const char *) r->codec->block_data, r->codec->used_size);