Ethereal-dev: Re: [Ethereal-dev] SoulSeek Dissector breaks MSVC build

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: Kendy Kutzner <kutzner@xxxxxxxxx>
Date: Thu, 12 Feb 2004 13:49:42 +0100
On 2004-02-12T10:24:08+0100, Biot Olivier wrote:
> Wait a minute: this method should be made available to all dissectors!

Take it. It should be reasonable generic (but maybe needs another
name):

/* 
 * Uncompresses a zlib compressed packet inside a tvb 
 * tvb*: the tvb; not touched in any way
 * offset: offset inside tvb
 * comprlen: length of compressed data
 * Returns a new uncompressed tvbuffer if uncompression succeeded 
 * or NULL if uncompression failed (or HAVE_LIBZ is not defined)
 */

tvbuff_t* uncompress_packet(tvbuff_t *tvb, int offset, int comprlen);

The only problems arise because there is no easy way to determine
the size of the uncompressed buffer. Currently the code takes a
(conservative?) guess that the uncompressed buffer is 9 times
larger than the compressed one. Uncompress failes if this guess
was wrong.

An alternative would be the use of inflate() and iterative memory
allocation.

Attached is a diff to make MSVC happier.

Kendy

-- 

Index: packet-slsk.c
===================================================================
RCS file: /cvsroot/ethereal/packet-slsk.c,v
retrieving revision 1.1
diff -u -r1.1 packet-slsk.c
--- packet-slsk.c	11 Feb 2004 20:23:19 -0000	1.1
+++ packet-slsk.c	12 Feb 2004 12:35:17 -0000
@@ -304,19 +304,34 @@
 	*             or NULL if uncompression failed
 	*/
 	
-	char compr[comprlen];
 	int i = 0;
-	long uncomprlen = (comprlen*10);
-	char uncompr[uncomprlen];
 	int err = 0;
+	long uncomprlen = (comprlen*10);
+	guint8 * compr;
+	guint8 * uncompr;
 	tvbuff_t *uncompr_tvb;
 
+	compr = g_malloc(comprlen);
+	if (!compr){
+		return NULL;
+	}
+	uncompr = g_malloc(uncomprlen);
+	if (!uncompr){
+		g_free(compr);
+		return NULL;
+	}
+
 	while (i < comprlen) { compr[i] = tvb_get_guint8(tvb, offset+i); i++;}
 
 	err = uncompress((Bytef *)uncompr, &uncomprlen, (Bytef *)compr, comprlen);
-	if (err != 0) return NULL;
+	g_free(compr);
+	if (err != 0) {
+		g_free(uncompr);
+		return NULL;
+	}
 	
 	uncompr_tvb =  tvb_new_real_data((guint8*) uncompr, uncomprlen, uncomprlen);
+	g_free(uncompr);
 	return uncompr_tvb;
 }
 #else

Attachment: pgp6NJG86uoKe.pgp
Description: PGP signature