Ethereal-dev: Re: [Ethereal-dev] SoulSeek Dissector

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: Wed, 11 Feb 2004 14:43:12 +0100
On 2003-12-20T18:30:36+0100, Joerg Mayer wrote:
> Two more things (the first one can be found in doc/README.developer
> section 1.1.1).

And here comes the diff...


-- 

--- packet-slsk.c	2003-12-10 16:06:26.000000000 +0100
+++ packet-slsk.c.3	2004-02-11 14:23:14.000000000 +0100
@@ -40,7 +40,10 @@
 #include <string.h>
 
 #include <glib.h>
+
+#ifdef HAVE_LIBZ
 #include <zlib.h>
+#endif
 
 #include <epan/packet.h>
 #include "packet-tcp.h"
@@ -121,7 +124,11 @@
 
 /* desegmentation of SoulSeek Message over TCP */
 static gboolean slsk_desegment = TRUE;
+#ifdef HAVE_LIBZ
 static gboolean slsk_decompress = TRUE;
+#else
+static gboolean slsk_decompress = FALSE;
+#endif
 
 static const value_string slsk_tcp_msgs[] = {
 	{ 1, "Login"},
@@ -233,11 +240,6 @@
 	*		* - can be used at the end of a format to ignore any following bytes
 	*/
 
-	char remaining_format[strlen(format)-1];
-	int i =0;
-	while (i < (int)strlen(format)){remaining_format[i] = format[i+1]; i++;}
-
-
 	switch ( format[0] ) {
 		case 'i':
 			if (tvb_length_remaining(tvb, offset) < 4) return FALSE;
@@ -260,11 +262,11 @@
 		break;
 	}
 	
-	if (remaining_format[0] == '\0' ) {
+	if (format[1] == '\0' ) {
 		if (tvb_length_remaining(tvb, offset) != 0) return FALSE;	/* Checks for additional bytes at the end */
 			return TRUE;
 	}
-	return check_slsk_format(tvb, offset, remaining_format);
+	return check_slsk_format(tvb, offset, &format[1]);
 
 }
 
@@ -282,30 +284,18 @@
 		if (check_slsk_format(tvb, 4, "bi")) 	message_type = "Pierce Fw";
 	}
 	return message_type;
-};
+}
 
 static guint get_slsk_pdu_len(tvbuff_t *tvb, int offset)
 {
 	guint32 msg_len;
-	
-	/*
-	* Checks if the Message Type is known.
-	* If it's not known, we cannot trust the first 4 bytes to be the
-	* message length flag, so we just say the length is
-	* 'what remains in the packet'.
-	*/
-//	if (strcmp(get_message_type(tvb), "Unknown") != 0) {
-		/* Get the length of the SoulSeek TCP packet. */
-		msg_len = tvb_get_letohl(tvb, offset);
-		
-		/* That length doesn't include the length field itself; add that in. */
-		msg_len += 4;
-		return msg_len;
-//	} else return tvb_length_remaining(tvb, offset);
-	
-	
+	msg_len = tvb_get_letohl(tvb, offset);
+	/* That length doesn't include the length field itself; add that in. */
+	msg_len += 4;
+	return msg_len;
 }
 
+#ifdef HAVE_LIBZ
 static tvbuff_t* uncompress_packet(tvbuff_t *tvb, int offset, int comprlen){
 	
 	/*
@@ -316,18 +306,25 @@
 	
 	char compr[comprlen];
 	int i = 0;
-	while (i < comprlen) { compr[i] = tvb_get_guint8(tvb, offset+i); i++;}
 	long uncomprlen = (comprlen*10);
 	char uncompr[uncomprlen];
-
-	int err = uncompress((Bytef *)uncompr, &uncomprlen, (Bytef *)compr, comprlen);
-		
+	int err = 0;
 	tvbuff_t *uncompr_tvb;
-	uncompr_tvb =  tvb_new_real_data((guint8*) uncompr, uncomprlen, uncomprlen);
-	
+
+	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;
+	
+	uncompr_tvb =  tvb_new_real_data((guint8*) uncompr, uncomprlen, uncomprlen);
 	return uncompr_tvb;
 }
+#else
+static tvbuff_t* uncompress_packet(tvbuff_t *tvb, int offset, int comprlen){
+	return NULL;
+}
+#endif
+
 
 
 /* Code to actually dissect the packets */
@@ -343,6 +340,14 @@
 	guint32 msg_len, msg_code;
 	gchar *message_type;
 
+	int comprlen = 0;
+	int uncomprlen = 0;
+	int uncompr_tvb_offset = 0;
+	int i2 = 0; 
+	int j2 = 0;
+	int i3 = 0;
+	int j3 = 0;
+
 	offset = 0;
 
 	msg_len = tvb_get_letohl(tvb, offset);
@@ -493,7 +498,7 @@
 					offset += 4;
 					
 					/* [zlib compressed] */
-					int comprlen = tvb_length_remaining(tvb, offset);
+					comprlen = tvb_length_remaining(tvb, offset);
 					
 					if (slsk_decompress == TRUE){
 							
@@ -512,12 +517,12 @@
 							
 							proto_tree_add_uint_format(slsk_tree, hf_slsk_integer, tvb, offset, tvb_length_remaining(tvb, offset), 0,
 								"(  compressed packet length: %d)", comprlen);
-							int uncomprlen = tvb_length_remaining(uncompr_tvb, 0);
+							uncomprlen = tvb_length_remaining(uncompr_tvb, 0);
 							proto_tree_add_uint_format(slsk_tree, hf_slsk_integer, tvb, offset, tvb_length_remaining(tvb, offset), 0,
 								"(uncompressed packet length: %d)", uncomprlen);
 							
 							/* Dissects the uncompressed tvbuffer */
-							int uncompr_tvb_offset = 0;
+							uncompr_tvb_offset = 0;
 							if (check_slsk_format(uncompr_tvb, uncompr_tvb_offset, "i*")) {
 								i=0; j = tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset);
 								proto_tree_add_uint_format(slsk_compr_packet_tree, hf_slsk_integer, uncompr_tvb, 0, 0, tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset),
@@ -530,7 +535,8 @@
 										proto_tree_add_uint_format(slsk_compr_packet_tree, hf_slsk_string_length, uncompr_tvb, 0, 0, tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset),
 											"Directory #%d Name: %s", i+1, tvb_get_string(uncompr_tvb, uncompr_tvb_offset+4, tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset)));
 										uncompr_tvb_offset += 4+tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset);
-										int i2=0; int j2 = tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset);
+										i2=0; 
+										j2 = tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset);
 										proto_tree_add_uint_format(slsk_compr_packet_tree, hf_slsk_integer, uncompr_tvb, 0, 0, tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset),
 											"Directory #%d Number of files: %d", i+1, tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset));
 										uncompr_tvb_offset += 4;
@@ -555,7 +561,8 @@
 												proto_tree_add_uint_format(slsk_compr_packet_tree, hf_slsk_string_length, uncompr_tvb, 0, 0, tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset),
 													"Dir #%d File #%d ext: %s", i+1, i2+1, tvb_get_string(uncompr_tvb, uncompr_tvb_offset+4, tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset)));
 												uncompr_tvb_offset += 4+tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset);
-												int i3=0; int j3 = tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset);
+												i3=0; 
+												j3 = tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset);
 												proto_tree_add_uint_format(slsk_compr_packet_tree, hf_slsk_integer, uncompr_tvb, 0, 0, tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset),
 													"Dir #%d File #%d Number of attributes: %d", i+1, i2+1, tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset));
 												uncompr_tvb_offset += 4;
@@ -623,7 +630,7 @@
 					offset += 4;
 					
 					/* [zlib compressed] */
-					int comprlen = tvb_length_remaining(tvb, offset);
+					comprlen = tvb_length_remaining(tvb, offset);
 					
 					if (slsk_decompress == TRUE){
 							
@@ -642,12 +649,12 @@
 							
 							proto_tree_add_uint_format(slsk_tree, hf_slsk_integer, tvb, offset, tvb_length_remaining(tvb, offset), 0,
 								"(  compressed packet length: %d)", comprlen);
-							int uncomprlen = tvb_length_remaining(uncompr_tvb, 0);
+							uncomprlen = tvb_length_remaining(uncompr_tvb, 0);
 							proto_tree_add_uint_format(slsk_tree, hf_slsk_integer, tvb, offset, tvb_length_remaining(tvb, offset), 0,
 								"(uncompressed packet length: %d)", uncomprlen);
 							
 							/* Dissects the uncompressed tvbuffer */
-							int uncompr_tvb_offset = 0;
+							uncompr_tvb_offset = 0;
 							if (check_slsk_format(uncompr_tvb, uncompr_tvb_offset, "sii*")) {
 								proto_tree_add_uint(slsk_compr_packet_tree, hf_slsk_string_length, uncompr_tvb, 0, 0, tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset));
 								proto_tree_add_uint_format(slsk_compr_packet_tree, hf_slsk_string_length, uncompr_tvb, 0, 0, tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset),
@@ -680,7 +687,8 @@
 										proto_tree_add_uint_format(slsk_compr_packet_tree, hf_slsk_string_length, uncompr_tvb, 0, 0, tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset),
 											"File #%d ext: %s", i+1, tvb_get_string(uncompr_tvb, uncompr_tvb_offset+4, tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset)));
 										uncompr_tvb_offset += 4+tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset);
-										int i2=0; int j2 = tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset);
+										i2=0; 
+										j2 = tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset);
 										proto_tree_add_uint_format(slsk_compr_packet_tree, hf_slsk_integer, uncompr_tvb, 0, 0, tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset),
 											"File #%d Number of attributes: %d", i+1, tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset));
 										uncompr_tvb_offset += 4;
@@ -1137,7 +1145,7 @@
 					offset += 4;
 
 					/* [zlib compressed] */
-					int comprlen = tvb_length_remaining(tvb, offset);
+					comprlen = tvb_length_remaining(tvb, offset);
 					
 					if (slsk_decompress == TRUE){
 							
@@ -1156,12 +1164,12 @@
 							
 							proto_tree_add_uint_format(slsk_tree, hf_slsk_integer, tvb, offset, tvb_length_remaining(tvb, offset), 0,
 								"(  compressed packet length: %d)", comprlen);
-							int uncomprlen = tvb_length_remaining(uncompr_tvb, 0);
+							uncomprlen = tvb_length_remaining(uncompr_tvb, 0);
 							proto_tree_add_uint_format(slsk_tree, hf_slsk_integer, tvb, offset, tvb_length_remaining(tvb, offset), 0,
 								"(uncompressed packet length: %d)", uncomprlen);
 							
 							/* Dissects the uncompressed tvbuffer */
-							int uncompr_tvb_offset = 0;
+							uncompr_tvb_offset = 0;
 							if (check_slsk_format(uncompr_tvb, uncompr_tvb_offset, "isi*")) {
 								proto_tree_add_uint_format(slsk_compr_packet_tree, hf_slsk_integer, uncompr_tvb, 0, 0, tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset),
 									"Token: %d", tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset));
@@ -1179,7 +1187,8 @@
 										proto_tree_add_uint_format(slsk_compr_packet_tree, hf_slsk_string_length, uncompr_tvb, 0, 0, tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset),
 											"Directory #%d Name: %s", i+1, tvb_get_string(uncompr_tvb, uncompr_tvb_offset+4, tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset)));
 										uncompr_tvb_offset += 4+tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset);
-										int i2=0; int j2 = tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset);
+										i2 = 0; 
+										j2 = tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset);
 										proto_tree_add_uint_format(slsk_compr_packet_tree, hf_slsk_integer, uncompr_tvb, 0, 0, tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset),
 											"Directory #%d Number of files: %d", i+1, tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset));
 										uncompr_tvb_offset += 4;
@@ -1204,7 +1213,8 @@
 												proto_tree_add_uint_format(slsk_compr_packet_tree, hf_slsk_string_length, uncompr_tvb, 0, 0, tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset),
 													"Dir #%d File #%d ext: %s", i+1, i2+1, tvb_get_string(uncompr_tvb, uncompr_tvb_offset+4, tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset)));
 												uncompr_tvb_offset += 4+tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset);
-												int i3=0; int j3 = tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset);
+												i3 = 0; 
+												j3 = tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset);
 												proto_tree_add_uint_format(slsk_compr_packet_tree, hf_slsk_integer, uncompr_tvb, 0, 0, tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset),
 													"Dir #%d File #%d Number of attributes: %d", i+1, i2+1, tvb_get_letohl(uncompr_tvb, uncompr_tvb_offset));
 												uncompr_tvb_offset += 4;
@@ -2482,11 +2492,12 @@
 	    "Desegment all SoulSeek messages spanning multiple TCP segments",
 	    "Whether the SoulSeek dissector should desegment all messages spanning multiple TCP segments",
 	    &slsk_desegment);
-
+#ifdef HAVE_LIBZ
 	prefs_register_bool_preference(slsk_module, "decompress",
 	    "Decompress zlib compressed packets inside SoulSeek messages",
 	    "Whether the SoulSeek dissector should decompress all zlib compressed packets inside messages",
 	    &slsk_decompress);
+#endif
 
 }
 

Attachment: pgpXszrL80aRc.pgp
Description: PGP signature