Hi,

   just a remember for this patch against a crash of wireshark with
gtk1.2 when using packet length statistics window.
The crash was due to a difference of implementation of g_strsplit
between gtk1.2 and gtk2.

(see http://www.wireshark.org/lists/wireshark-dev/200612/msg00218.html
for more details and a review of the dissectors using this function)



Regards,

Sebastien Tandel
Index: epan/stats_tree.c
===================================================================
--- epan/stats_tree.c   (révision 20466)
+++ epan/stats_tree.c   (copie de travail)
@@ -524,18 +524,63 @@
 }
 
 
+/*
+ * This function accepts an input string which should define a long integer 
range.
+ * The normal result is a struct containing the floor and ceil value of this
+ * range.
+ *
+ * It is allowed to define a range string in the following ways :
+ *
+ * "0-10" -> { 0, 10 }
+ * "-0" -> { G_MININT, 0 }
+ * "0-" -> { 0, G_MAXINT }
+ * "-" -> { G_MININT, G_MAXINT }
+ *
+ * Note that this function is robust to buggy input string. If in some cases it
+ * returns NULL, it but may also return a pair with undefined values.
+ *
+ */
 static range_pair_t* get_range(guint8* rngstr) {
        gchar** split;
-       range_pair_t* rng = g_malloc(sizeof(range_pair_t));
+       range_pair_t* rng;
        
-       split =  g_strsplit(rngstr,"-",2);
+       split = g_strsplit((gchar*)rngstr,"-",2);
 
-       rng->floor = strtol(split[0],NULL,10);
-       rng->ceil  = strtol(split[1],NULL,10);
+       /* empty string */
+       if (split[0] == NULL) {
+         g_strfreev(split);
+         return NULL;
+       }
+
+#if GLIB_MAJOR_VERSION >= 2
+       /* means we have a non empty string 
+        * which does not contain a delimiter */
+       if (split[1] == NULL) {
+         g_strfreev(split);
+         return NULL;
+       }
+#endif
+
+       rng = g_malloc(sizeof(range_pair_t));
+
+       /* string == "X-?" */
+       if (*(split[0]) != '\0') {
+           rng->floor = strtol(split[0],NULL,10);
+       } else
+         /* string == "-?" */
+         rng->floor = G_MININT;
+
+       /* string != "?-" */
+#if GLIB_MAJOR_VERSION >= 2
+       if (*(split[1]) != '\0') {
+#else
+       if (split[1] != NULL) {
+#endif
+         rng->ceil  = strtol(split[1],NULL,10);
+       } else
+         /* string == "?-" */
+         rng->ceil = G_MAXINT;
        
-       if (rng->ceil == 0) rng->ceil = G_MAXINT;
-       if (rng->floor == 0) rng->floor = G_MININT;
-
        g_strfreev(split);
        
        return rng;
_______________________________________________
Wireshark-dev mailing list
[email protected]
http://www.wireshark.org/mailman/listinfo/wireshark-dev

Reply via email to