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: pgp00000.pgp
Description: PGP signature

_______________________________________________
Ethereal-dev mailing list
[EMAIL PROTECTED]
http://www.ethereal.com/mailman/listinfo/ethereal-dev

Reply via email to