OpenPKG CVS Repository
http://cvs.openpkg.org/
____________________________________________________________________________
Server: cvs.openpkg.org Name: Michael Schloh
Root: /e/openpkg/cvs Email: [EMAIL PROTECTED]
Module: openpkg-src Date: 16-Apr-2004 15:04:43
Branch: OPENPKG_1_3_SOLID Handle: 2004041614044200
Modified files: (Branch: OPENPKG_1_3_SOLID)
openpkg-src/ethereal ethereal.patch ethereal.spec
Log:
add patchcode to remove vulnerabilities in protocol dissectors, RADIUS
packets, and color filter dialog as described in OpenPKG-SA-2004.015
(CAN-2004-0176 and CAN-2004-0365)
Summary:
Revision Changes Path
1.1.2.2.2.1 +937 -2 openpkg-src/ethereal/ethereal.patch
1.11.2.3.2.2+1 -1 openpkg-src/ethereal/ethereal.spec
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: openpkg-src/ethereal/ethereal.patch
============================================================================
$ cvs diff -u -r1.1.2.2 -r1.1.2.2.2.1 ethereal.patch
--- openpkg-src/ethereal/ethereal.patch 24 Jul 2003 20:49:29 -0000 1.1.2.2
+++ openpkg-src/ethereal/ethereal.patch 16 Apr 2004 13:04:42 -0000
1.1.2.2.2.1
@@ -1,3 +1,4 @@
+diff -Nau gtk/main.c.orig gtk/main.c
--- gtk/main.c.orig Mon Sep 30 08:59:51 2002
+++ gtk/main.c Mon Sep 30 08:59:38 2002
@@ -43,6 +43,7 @@
@@ -6,5 +7,939 @@
#include <ctype.h>
+#include <unistd.h>
- #ifdef HAVE_IO_H
- #include <io.h> /* open/close on win32 */
+ #ifdef HAVE_UNISTD_H
+ #include <unistd.h>
+diff -Nau Makefile.in.orig Makefile.in
+--- Makefile.in.orig 2003-12-13 18:12:49.000000000 +0100
++++ Makefile.in 2004-04-15 17:30:12.000000000 +0200
+@@ -2859,14 +2859,9 @@
+ # All subsequent arguments are the files to scan.
+ #
+ register.c: $(plugin_src) $(DISSECTOR_SRC) $(srcdir)/make-reg-dotc
+- @if test -n $(PYTHON); then \
+- echo Making register.c with python ; \
+- $(PYTHON) $(srcdir)/make-reg-dotc.py $(srcdir) $(DISSECTOR_SRC) ; \
+- else \
+- echo Making register.c with shell script ; \
+- $(srcdir)/make-reg-dotc register.c $(srcdir) \
+- $(plugin_src) $(DISSECTOR_SRC) ; \
+- fi
++ echo Making register.c with shell script ; \
++ $(srcdir)/make-reg-dotc register.c $(srcdir) \
++ $(plugin_src) $(DISSECTOR_SRC) ;
+
+ #
+ # Build "tethereal-tap-register.c", which contains a function
+diff -Nau gtk/color_filters.c.orig gtk/color_filters.c
+--- gtk/color_filters.c.orig 2004-04-14 16:08:36.133500000 +0200
++++ gtk/color_filters.c 2004-04-15 11:10:30.103952683 +0200
+@@ -30,6 +30,7 @@
+
+ #include <gtk/gtk.h>
+
++#include <ctype.h>
+ #include <string.h>
+
+ #include <epan/filesystem.h>
+@@ -47,7 +48,7 @@
+ static gboolean read_filters(void);
+ static gboolean read_global_filters(void);
+
+-GSList *filter_list;
++GSList *filter_list = NULL;
+
+ /* delete the specified filter */
+ void
+@@ -59,13 +60,12 @@
+ g_free(colorf->filter_text);
+ if (colorf->c_colorfilter != NULL)
+ dfilter_free(colorf->c_colorfilter);
+- filter_list = g_slist_remove(filter_list, colorf);
+ g_free(colorf);
+ }
+
+ /* delete the specified filter as an iterator*/
+ static void
+-delete_color_filter_it(gpointer filter_arg, gpointer ignored _U_)
++delete_color_filter_it(gpointer filter_arg, gpointer unused _U_)
+ {
+ color_filter_t *colorf = filter_arg;
+
+@@ -78,6 +78,8 @@
+ delete_all_color_filters (void)
+ {
+ g_slist_foreach(filter_list, delete_color_filter_it, NULL);
++ g_slist_free(filter_list);
++ filter_list = NULL;
+ }
+
+ /* Initialize the filter structures (reading from file) for general running,
including app startup */
+@@ -97,7 +99,7 @@
+ color_filter_t *colorf;
+ GtkStyle *style;
+
+- colorf = (color_filter_t *)g_malloc(sizeof (color_filter_t));
++ colorf = g_malloc(sizeof (color_filter_t));
+ colorf->filter_name = g_strdup(name);
+ colorf->filter_text = g_strdup(filter_string);
+ style = gtk_widget_get_style(packet_list);
+@@ -133,40 +135,109 @@
+ static gboolean
+ read_filters_file(gpointer file_arg)
+ {
+- /* TODO: Lots more syntax checking on the file */
+- /* I hate these fixed length names! TODO: make more dynamic */
+- /* XXX - buffer overflow possibility here
+- * sscanf blocks max size of name and filter_exp; buf is used for
+- * reading only */
+- gchar name[256],filter_exp[256], buf[1024];
++#define INIT_BUF_SIZE 128
++ gchar *name = NULL;
++ gchar *filter_exp = NULL;
++ guint32 name_len = INIT_BUF_SIZE;
++ guint32 filter_exp_len = INIT_BUF_SIZE;
++ guint32 i = 0;
++ gint32 c;
+ guint16 fg_r, fg_g, fg_b, bg_r, bg_g, bg_b;
+- GdkColor fg_color, bg_color;
+- color_filter_t *colorf;
+- dfilter_t *temp_dfilter;
+ FILE *f = file_arg;
++ gboolean skip_end_of_line = FALSE;
++
++ name = g_malloc(name_len + 1);
++ filter_exp = g_malloc(filter_exp_len + 1);
++
++ while (1) {
++
++ if (skip_end_of_line) {
++ do {
++ c = getc(f);
++ } while (c != EOF && c != '\n');
++ if (c == EOF)
++ break;
++ skip_end_of_line = FALSE;
++ }
++
++ while ((c = getc(f)) != EOF && isspace(c)) {
++ if (c == '\n') {
++ continue;
++ }
++ }
+
+- do {
+- if (fgets(buf,sizeof buf, f) == NULL)
++ if (c == EOF)
+ break;
+
+- if (strspn(buf," \t") == (size_t)((strchr(buf,'*') - buf))) {
+- /* leading # comment */
++ /* skip # comments and invalid lines */
++ if (c != '@') {
++ skip_end_of_line = TRUE;
+ continue;
+ }
+
+- /* we get the @ delimiter. It is not in any strings
++ /* we get the @ delimiter.
+ * Format is:
+ * @[EMAIL PROTECTED] [EMAIL PROTECTED] r,g,b][foreground r,g,b]
+ */
+- if (sscanf(buf," @[EMAIL PROTECTED]@[EMAIL
PROTECTED]@[%hu,%hu,%hu][%hu,%hu,%hu]",
+- name, filter_exp, &bg_r, &bg_g, &bg_b, &fg_r, &fg_g, &fg_b)
+- == 8) {
+- /* we got a filter */
++ /* retrieve name */
++ i = 0;
++ while (1) {
++ c = getc(f);
++ if (c == EOF || c == '@')
++ break;
++ if (i >= name_len) {
++ /* buffer isn't long enough; double its length.*/
++ name_len *= 2;
++ name = g_realloc(name, name_len + 1);
++ }
++ name[i++] = c;
++ }
++ name[i] = '\0';
++
++ if (c == EOF) {
++ break;
++ } else if (i == 0) {
++ skip_end_of_line = TRUE;
++ continue;
++ }
++
++ /* retrieve filter expression */
++ i = 0;
++ while (1) {
++ c = getc(f);
++ if (c == EOF || c == '@')
++ break;
++ if (i >= filter_exp_len) {
++ /* buffer isn't long enough; double its length.*/
++ filter_exp_len *= 2;
++ filter_exp = g_realloc(filter_exp, filter_exp_len + 1);
++ }
++ filter_exp[i++] = c;
++ }
++ filter_exp[i] = '\0';
++
++ if (c == EOF) {
++ break;
++ } else if (i == 0) {
++ skip_end_of_line = TRUE;
++ continue;
++ }
++
++ /* retrieve background and foreground colors */
++ if (fscanf(f,"[%hu,%hu,%hu][%hu,%hu,%hu]",
++ &bg_r, &bg_g, &bg_b, &fg_r, &fg_g, &fg_b) == 6) {
++
++ /* we got a complete color filter */
++
++ GdkColor fg_color, bg_color;
++ color_filter_t *colorf;
++ dfilter_t *temp_dfilter;
+
+ if (!dfilter_compile(filter_exp, &temp_dfilter)) {
+ simple_dialog(ESD_TYPE_CRIT, NULL,
+ "Could not compile color filter %s from saved filters.\n%s",
+ name, dfilter_error_msg);
++ skip_end_of_line = TRUE;
+ continue;
+ }
+ if (!get_color(&fg_color)) {
+@@ -175,6 +246,7 @@
+ "Could not allocate foreground color "
+ "specified in input file for %s.", name);
+ dfilter_free(temp_dfilter);
++ skip_end_of_line = TRUE;
+ continue;
+ }
+ if (!get_color(&bg_color)) {
+@@ -183,6 +255,7 @@
+ "Could not allocate background color "
+ "specified in input file for %s.", name);
+ dfilter_free(temp_dfilter);
++ skip_end_of_line = TRUE;
+ continue;
+ }
+
+@@ -198,19 +271,17 @@
+ gdkcolor_to_color_t(&colorf->bg_color, &bg_color);
+ gdkcolor_to_color_t(&colorf->fg_color, &fg_color);
+ } /* if sscanf */
++ skip_end_of_line = TRUE;
+ } while(!feof(f));
+ fclose(f);
++ g_free(name);
++ g_free(filter_exp);
+ return TRUE;
+ }
+ /* read filters from the user's filter file */
+ static gboolean
+ read_filters(void)
+ {
+- /* TODO: Lots more syntax checking on the file */
+- /* I hate these fixed length names! TODO: make more dynamic */
+- /* XXX - buffer overflow possibility here
+- * sscanf blocks max size of name and filter_exp; buf is used for
+- * reading only */
+ gchar *path;
+ FILE *f;
+
+@@ -222,10 +293,10 @@
+ "Could not open filter file\n\"%s\": %s.", path,
+ strerror(errno));
+ }
+- g_free((gchar *)path);
++ g_free(path);
+ return FALSE;
+ }
+- g_free((gchar *)path);
++ g_free(path);
+ path = NULL;
+
+ return read_filters_file(f);
+@@ -246,10 +317,10 @@
+ "Could not open global filter file\n\"%s\": %s.", path,
+ strerror(errno));
+ }
+- g_free((gchar *)path);
++ g_free(path);
+ return FALSE;
+ }
+- g_free((gchar *)path);
++ g_free(path);
+ path = NULL;
+
+ return read_filters_file(f);
+@@ -331,8 +402,12 @@
+ }
+
+ path = get_persconffile_path("colorfilters", TRUE);
+- if (!deletefile(path))
++ if (!deletefile(path)) {
++ g_free((gchar *)path);
+ return FALSE;
++ }
++
++ g_free((gchar *)path);
+
+ /* Reload the (global) filters - Note: this does not update the dialog. */
+ colfilter_init();
+diff -Nau gtk/color_filters.h.orig gtk/color_filters.h
+--- gtk/color_filters.h.orig 2003-05-17 18:33:02.000000000 +0200
++++ gtk/color_filters.h 2004-04-15 12:29:27.180473106 +0200
+@@ -24,10 +24,6 @@
+ #ifndef __COLOR_FILTERS_H__
+ #define __COLOR_FILTERS_H__
+
+-#define MAXCOLORS 255
+-#define MAX_COLOR_FILTER_NAME_LEN 33
+-#define MAX_COLOR_FILTER_STRING_LEN 256
+-
+ #define CFILTERS_CONTAINS_FILTER(filter) \
+ ((filter)->num_of_filters != 0)
+
+diff -Nau packet-bgp.c.orig packet-bgp.c
+--- packet-bgp.c.orig 2003-06-05 05:19:27.000000000 +0200
++++ packet-bgp.c 2004-04-14 17:18:16.239727753 +0200
+@@ -370,7 +370,7 @@
+
+ /* snarf length */
+ plen = tvb_get_guint8(tvb, offset);
+- if (plen > 32) {
++ if (plen > 32 || plen == 0) {
+ proto_tree_add_text(tree, tvb, offset, 1, "%s length %u invalid",
+ tag, plen);
+ return -1;
+@@ -415,7 +415,7 @@
+
+ /* snarf length */
+ plen = tvb_get_guint8(tvb, offset);
+- if (plen > 128) {
++ if (plen > 128 || plen == 0) {
+ proto_tree_add_text(tree, tvb, offset, 1, "%s length %u invalid",
+ tag, plen);
+ return -1;
+@@ -451,7 +451,7 @@
+ * Decode an MPLS label stack
+ * XXX - Should we convert "buf" to a GString?
+ */
+-static int
++static gint
+ decode_MPLS_stack(tvbuff_t *tvb, gint offset, char *buf, size_t buflen)
+ {
+ guint32 label_entry; /* an MPLS label enrty (label + COS field + stack
bit */
+@@ -553,6 +553,7 @@
+ case SAFNUM_UNICAST:
+ case SAFNUM_MULCAST:
+ case SAFNUM_UNIMULC:
++ case SAFNUM_MPLS_LABEL:
+ length = 16 ;
+ tvb_memcpy(tvb, ip6addr.u6_addr.u6_addr8,offset, 16);
+ g_string_sprintf(buf, "%s", ip6_to_str(&ip6addr));
+@@ -627,8 +628,8 @@
+ proto_tree *prefix_tree;
+ int total_length; /* length of the entire item */
+ int length; /* length of the prefix address, in
bytes */
+- guint8 plen; /* length of the prefix address, in
bits */
+- int labnum; /* number of labels */
++ guint plen; /* length of the prefix address, in
bits */
++ guint labnum; /* number of labels */
+ int ce_id,labblk_off;
+ union {
+ guint8 addr_bytes[4];
+@@ -662,7 +663,7 @@
+ return -1;
+ }
+ plen -= (labnum * 3*8);
+- if (plen > 32) {
++ if (plen > 32 || plen == 0) {
+ proto_tree_add_text(tree, tvb, start_offset, 1,
+ "%s IPv4 prefix length %u invalid",
+ tag, plen + (labnum * 3*8));
+@@ -717,7 +718,7 @@
+ switch (rd_type) {
+
+ case FORMAT_AS2_LOC: /* Code borrowed from the decode_prefix4 function
*/
+- if (plen > 32) {
++ if (plen > 32 || plen == 0) {
+ proto_tree_add_text(tree, tvb, start_offset, 1,
+ "%s IPv4 prefix length %u invalid",
+ tag, plen + (labnum * 3*8) + 8*8);
+@@ -752,7 +753,7 @@
+ case FORMAT_IP_LOC: /* Code borrowed from the decode_prefix4 function
*/
+ tvb_memcpy(tvb, ip4addr.addr_bytes, offset + 2, 4);
+
+- if (plen > 32) {
++ if (plen > 32 || plen == 0) {
+ proto_tree_add_text(tree, tvb, start_offset, 1,
+ "%s IPv4 prefix length %u invalid",
+ tag, plen + (labnum * 3*8) + 8*8);
+@@ -802,6 +803,38 @@
+ return -1;
+ break;
+
++ case SAFNUM_MPLS_LABEL:
++ plen = tvb_get_guint8(tvb, offset);
++ labnum = decode_MPLS_stack(tvb, offset + 1, lab_stk, sizeof(lab_stk));
++
++ offset += (1 + labnum * 3);
++ if (plen <= (labnum * 3*8)) {
++ proto_tree_add_text(tree, tvb, start_offset, 1,
++ "%s IPv6 prefix length %u invalid", tag, plen);
++ return -1;
++ }
++ plen -= (labnum * 3*8);
++
++ if (plen > 128 || plen == 0) {
++ proto_tree_add_text(tree, tvb, start_offset, 1,
++ "%s IPv6 prefix length %u invalid", tag, plen);
++ return -1;
++ }
++
++ length = (plen + 7) / 8;
++ memset(ip6addr.u6_addr.u6_addr8, 0, 16);
++ tvb_memcpy(tvb, ip6addr.u6_addr.u6_addr8, offset, length);
++ if (plen % 8)
++ ip6addr.u6_addr.u6_addr8[length - 1] &= ((0xff00 >> (plen % 8)) &
0xff);
++
++ ti = proto_tree_add_text(tree, tvb, start_offset,
++ (offset + length) - start_offset,
++ "Label Stack=%s, IP=%s/%u",
++ lab_stk,
++ ip6_to_str(&ip6addr), plen);
++ total_length = (1 + labnum * 3) + length;
++ break;
++
+ case SAFNUM_LAB_VPNUNICAST:
+ case SAFNUM_LAB_VPNMULCAST:
+ case SAFNUM_LAB_VPNUNIMULC:
+@@ -828,7 +861,7 @@
+ switch (rd_type) {
+
+ case FORMAT_AS2_LOC:
+- if (plen > 128) {
++ if (plen > 128 || plen == 0) {
+ proto_tree_add_text(tree, tvb, start_offset, 1,
+ "%s IPv6 prefix length %u invalid",
+ tag, plen + (labnum * 3*8) + 8*8);
+@@ -854,7 +887,7 @@
+ case FORMAT_IP_LOC:
+ tvb_memcpy(tvb, ip4addr.addr_bytes, offset + 2, 4);
+
+- if (plen > 128) {
++ if (plen > 128 || plen == 0) {
+ proto_tree_add_text(tree, tvb, start_offset, 1,
+ "%s IPv6 prefix length %u invalid",
+ tag, plen + (labnum * 3*8) + 8*8);
+diff -Nau packet-eigrp.c.orig packet-eigrp.c
+--- packet-eigrp.c.orig 2002-08-29 02:39:52.000000000 +0200
++++ packet-eigrp.c 2004-04-14 17:18:16.241179220 +0200
+@@ -312,12 +312,22 @@
+ proto_tree_add_text (tree,tvb,17,1,"Load = %u",tvb_get_guint8(tvb,17));
+ proto_tree_add_text (tree,tvb,18,2,"Reserved ");
+ length=tvb_get_guint8(tvb,20);
++ if (length > 32) {
++ proto_tree_add_text (tree,tvb,20,1,"Prefix length = %u (invalid, must be
<= 32)",length);
++ proto_item_append_text (ti," [Invalid prefix length %u > 32]",length);
++ } else if (length == 0) {
++ proto_tree_add_text (tree,tvb,20,1,"Prefix length = %u (invalid, must be >
0)",length);
++ proto_item_append_text (ti," [Invalid prefix length %u]",length);
++ } else {
+ proto_tree_add_text (tree,tvb,20,1,"Prefix Length = %u",length);
+- if (length % 8 == 0) addr_len=length/8 ; else addr_len=length/8+1;
++ addr_len=(length+7)/8;
+ ip_addr[0]=ip_addr[1]=ip_addr[2]=ip_addr[3]=0;
+ tvb_memcpy(tvb,ip_addr,21,addr_len);
++ if (length%8)
++ ip_addr[addr_len - 1] &= ((0xff00 >> (length % 8)) & 0xff);
+ proto_tree_add_text (tree,tvb,21,addr_len,"Destination =
%s",ip_to_str(ip_addr));
+ proto_item_append_text (ti," =
%s/%u%s",ip_to_str(ip_addr),length,((tvb_get_ntohl(tvb,4)==0xffffffff)?" - Destination
unreachable":""));
++ }
+ }
+
+ static void dissect_eigrp_ip_ext (tvbuff_t *tvb, proto_tree *tree, proto_item *ti)
+@@ -342,12 +352,22 @@
+ proto_tree_add_text (tree,tvb,37,1,"Load = %u",tvb_get_guint8(tvb,37));
+ proto_tree_add_text (tree,tvb,38,2,"Reserved ");
+ length=tvb_get_guint8(tvb,40);
++ if (length > 32) {
++ proto_tree_add_text (tree,tvb,40,1,"Prefix length = %u (invalid, must be
<= 32)",length);
++ proto_item_append_text (ti," [Invalid prefix length %u > 32]",length);
++ } else if (length == 0) {
++ proto_tree_add_text (tree,tvb,40,1,"Prefix length = %u (invalid, must be >
0)",length);
++ proto_item_append_text (ti," [Invalid prefix length %u]",length);
++ } else {
+ proto_tree_add_text (tree,tvb,40,1,"Prefix Length = %u",length);
+- if (length % 8 == 0) addr_len=length/8 ; else addr_len=length/8+1;
++ addr_len=(length+7)/8;
+ ip_addr[0]=ip_addr[1]=ip_addr[2]=ip_addr[3]=0;
+ tvb_memcpy(tvb,ip_addr,41,addr_len);
++ if (length%8)
++ ip_addr[addr_len - 1] &= ((0xff00 >> (length % 8)) & 0xff);
+ proto_tree_add_text (tree,tvb,41,addr_len,"Destination =
%s",ip_to_str(ip_addr));
+- proto_item_append_text (ti," =
%s/%u%s",ip_to_str(ip_addr),length,((tvb_get_ntohl(tvb,24)==0xffffffff)?" -
Destination unreachable":""));
++ proto_item_append_text (ti," =
%s/%u%s",ip_to_str(ip_addr),length,((tvb_get_ntohl(tvb,4)==0xffffffff)?" - Destination
unreachable":""));
++ }
+ }
+
+
+diff -Nau packet-netflow.c.orig packet-netflow.c
+--- packet-netflow.c.orig 2003-03-08 03:40:30.000000000 +0100
++++ packet-netflow.c 2004-04-14 17:18:16.243223207 +0200
+@@ -122,7 +122,6 @@
+ };
+
+ /* Version 9 template cache structures */
+-#define V9TEMPLATE_MAX_ENTRIES 64
+ #define V9TEMPLATE_CACHE_MAX_ENTRIES 100
+
+ struct v9_template_entry {
+@@ -136,7 +135,7 @@
+ guint32 length;
+ guint32 source_id;
+ guint32 source_addr;
+- struct v9_template_entry entries[V9TEMPLATE_MAX_ENTRIES];
++ struct v9_template_entry *entries;
+ };
+
+ static struct v9_template v9_template_cache[V9TEMPLATE_CACHE_MAX_ENTRIES];
+@@ -1160,6 +1159,7 @@
+ template.count = count;
+ template.source_addr = 0; /* XXX */
+ template.source_id = 0; /* XXX */
++ template.entries = g_malloc(count * sizeof(struct v9_template_entry));
+ tvb_memcpy(tvb, (guint8 *)template.entries, offset,
+ count * sizeof(struct v9_template_entry));
+ v9_template_add(&template);
+@@ -1368,6 +1368,22 @@
+ return (ip_to_str((const guint8 *)&gprefix));
+ }
+
++
++static void
++netflow_reinit(void)
++{
++ int i;
++
++ /*
++ * Clear out the template cache.
++ * Free the table of fields for each entry, and then zero out
++ * the cache.
++ */
++ for (i = 0; i < V9TEMPLATE_CACHE_MAX_ENTRIES; i++)
++ g_free(v9_template_cache[i].entries);
++ memset(v9_template_cache, 0, sizeof v9_template_cache);
++}
++
+ void
+ proto_register_netflow(void)
+ {
+@@ -1709,7 +1725,7 @@
+ "NetFlow UDP Port", "Set the port for NetFlow messages",
+ 10, &global_netflow_udp_port);
+
+- register_dissector("cflow", dissect_netflow, proto_netflow);
++ register_init_routine(&netflow_reinit);
+ }
+
+
+diff -Nau packet-pgm.c.orig packet-pgm.c
+--- packet-pgm.c.orig 2003-03-12 05:04:13.000000000 +0100
++++ packet-pgm.c 2004-04-14 17:18:16.246743589 +0200
+@@ -596,11 +596,25 @@
+ proto_tree *opt_tree = NULL;
+ pgm_opt_length_t opts;
+ pgm_opt_generic_t genopts;
+- int theend = 0, firsttime = 1;
++ gboolean theend = FALSE, firsttime = TRUE;
+
+ tvb_memcpy(tvb, (guint8 *)&opts, offset, sizeof(opts));
++ if (opts.type != PGM_OPT_LENGTH) {
++ proto_tree_add_text(tree, tvb, offset, 1,
++ "%s Options - initial option is %s, should be %s",
++ pktname,
++ val_to_str(opts.type, opt_vals, "Unknown (0x%02x)"),
++ val_to_str(PGM_OPT_LENGTH, opt_vals, "Unknown (0x%02x)"));
++ return;
++ }
+ opts.total_len = g_ntohs(opts.total_len);
+
++ if (opts.total_len < 4) {
++ proto_tree_add_text(opts_tree, tvb, offset, 4,
++ "%s Options (Total Length %u - invalid, must be >= 4)",
++ pktname, opts.total_len);
++ return;
++ }
+ tf = proto_tree_add_text(tree, tvb, offset,
+ opts.total_len,
+ "%s Options (Total Length %d)", pktname, opts.total_len);
+@@ -613,35 +627,61 @@
+ offset+2, 2, opts.total_len);
+
+ offset += 4;
+- for (opts.total_len -= 4; opts.total_len > 0;){
++ for (opts.total_len -= 4; !theend && opts.total_len != 0;){
++ if (opts.total_len < 4) {
++ proto_tree_add_text(opts_tree, tvb, offset, opts.total_len,
++ "Remaining total options length doesn't have enough for an
options header");
++ break;
++ }
+ tvb_memcpy(tvb, (guint8 *)&genopts, offset, sizeof(genopts));
+ if (genopts.type & PGM_OPT_END) {
+ genopts.type &= ~PGM_OPT_END;
+- theend = 1;
++ theend = TRUE;
++ }
++ if (genopts.len < 4) {
++ proto_tree_add_text(opts_tree, tvb, offset, genopts.len,
++ "Option: %s, Length: %u (invalid, must be >= 4)",
++ val_to_str(genopts.type, opt_vals, "Unknown (0x%02x)"),
++ genopts.len);
++ break;
++ }
++ if (opts.total_len < genopts.len) {
++ proto_tree_add_text(opts_tree, tvb, offset, genopts.len,
++ "Option: %s, Length: %u (> remaining total options
length)",
++ val_to_str(genopts.type, opt_vals, "Unknown (0x%02x)"),
++ genopts.len);
++ break;
+ }
+ tf = proto_tree_add_text(opts_tree, tvb, offset, genopts.len,
+ "Option: %s, Length: %u",
+ val_to_str(genopts.type, opt_vals, "Unknown (0x%02x)"),
+ genopts.len);
+- if (genopts.len == 0)
+- break;
+
+ switch(genopts.type) {
+ case PGM_OPT_JOIN:{
+ pgm_opt_join_t optdata;
+
+- tvb_memcpy(tvb, (guint8 *)&optdata, offset, sizeof(optdata));
+ opt_tree = proto_item_add_subtree(tf, ett_pgm_opts_join);
+
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_type,
+ tvb, offset, 1, genopts.type);
+
++ if (genopts.len < sizeof optdata) {
++ proto_tree_add_uint_format(opt_tree,
hf_pgm_genopt_len, tvb,
++ offset+1, 1, genopts.len,
++ "Length: %u (bogus, must be >= %lu)",
++ genopts.len,
++ (unsigned long)sizeof optdata);
++ break;
++ }
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_len, tvb,
+ offset+1, 1, genopts.len);
+
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_opx, tvb,
+ offset+2, 1, genopts.opx);
+
++ tvb_memcpy(tvb, (guint8 *)&optdata, offset, sizeof(optdata));
++
+ proto_tree_add_uint(opt_tree, hf_pgm_opt_join_res, tvb,
+ offset+3, 1, optdata.res);
+
+@@ -653,18 +693,27 @@
+ case PGM_OPT_PARITY_PRM:{
+ pgm_opt_parity_prm_t optdata;
+
+- tvb_memcpy(tvb, (guint8 *)&optdata, offset, sizeof(optdata));
+ opt_tree = proto_item_add_subtree(tf, ett_pgm_opts_parityprm);
+
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_type,
+ tvb, offset, 1, genopts.type);
+
++ if (genopts.len < sizeof optdata) {
++ proto_tree_add_uint_format(opt_tree,
hf_pgm_genopt_len, tvb,
++ offset+1, 1, genopts.len,
++ "Length: %u (bogus, must be >= %lu)",
++ genopts.len,
++ (unsigned long) sizeof optdata);
++ break;
++ }
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_len, tvb,
+ offset+1, 1, genopts.len);
+
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_opx,
+ tvb, offset+2, 1, genopts.opx);
+
++ tvb_memcpy(tvb, (guint8 *)&optdata, offset, sizeof(optdata));
++
+ proto_tree_add_uint_format(opt_tree, hf_pgm_opt_parity_prm_po,
tvb,
+ offset+3, 1, optdata.po, "Parity Parameters: %s
(0x%x)",
+ paritystr(optdata.po), optdata.po);
+@@ -677,18 +726,27 @@
+ case PGM_OPT_PARITY_GRP:{
+ pgm_opt_parity_grp_t optdata;
+
+- tvb_memcpy(tvb, (guint8 *)&optdata, offset, sizeof(optdata));
+ opt_tree = proto_item_add_subtree(tf, ett_pgm_opts_paritygrp);
+
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_type,
+ tvb, offset, 1, genopts.type);
+
++ if (genopts.len < sizeof optdata) {
++ proto_tree_add_uint_format(opt_tree,
hf_pgm_genopt_len, tvb,
++ offset+1, 1, genopts.len,
++ "Length: %u (bogus, must be >= %lu)",
++ genopts.len,
++ (unsigned long) sizeof optdata);
++ break;
++ }
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_len, tvb,
+ offset+1, 1, genopts.len);
+
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_opx,
+ tvb, offset+2, 1, genopts.opx);
+
++ tvb_memcpy(tvb, (guint8 *)&optdata, offset, sizeof(optdata));
++
+ proto_tree_add_uint(opt_tree, hf_pgm_opt_parity_grp_res, tvb,
+ offset+3, 1, optdata.res);
+
+@@ -703,18 +761,27 @@
+ char nakbuf[8192], *ptr;
+ int i, j, naks, soffset = 0;
+
+- tvb_memcpy(tvb, (guint8 *)&optdata, offset, sizeof(optdata));
+ opt_tree = proto_item_add_subtree(tf, ett_pgm_opts_naklist);
+
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_type, tvb,
+ offset, 1, genopts.type);
+
++ if (genopts.len < sizeof optdata) {
++ proto_tree_add_uint_format(opt_tree,
hf_pgm_genopt_len, tvb,
++ offset+1, 1, genopts.len,
++ "Length: %u (bogus, must be >= %lu)",
++ genopts.len,
++ (unsigned long) sizeof optdata);
++ break;
++ }
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_len, tvb,
+ offset+1, 1, genopts.len);
+
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_opx,
+ tvb, offset+2, 1, genopts.opx);
+
++ tvb_memcpy(tvb, (guint8 *)&optdata, offset, sizeof(optdata));
++
+ proto_tree_add_uint(opt_tree, hf_pgm_opt_nak_res, tvb,
+ offset+3, 1, optdata.res);
+
+@@ -742,7 +809,7 @@
+ nakbuf, "List: %s", nakbuf);
+ soffset = 0;
+ }
+- firsttime = 0;
++ firsttime = FALSE;
+ }
+ }
+ if (soffset) {
+@@ -763,18 +830,27 @@
+ case PGM_OPT_PGMCC_DATA:{
+ pgm_opt_pgmcc_data_t optdata;
+
+- tvb_memcpy(tvb, (guint8 *)&optdata, offset, sizeof(optdata));
+ opt_tree = proto_item_add_subtree(tf, ett_pgm_opts_ccdata);
+
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_type,
+ tvb, offset, 1, genopts.type);
+
++ if (genopts.len < sizeof optdata) {
++ proto_tree_add_uint_format(opt_tree,
hf_pgm_genopt_len, tvb,
++ offset+1, 1, genopts.len,
++ "Length: %u (bogus, must be >= %lu)",
++ genopts.len,
++ (unsigned long) sizeof optdata);
++ break;
++ }
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_len, tvb,
+ offset+1, 1, genopts.len);
+
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_opx,
+ tvb, offset+2, 1, genopts.opx);
+
++ tvb_memcpy(tvb, (guint8 *)&optdata, offset, sizeof(optdata));
++
+ proto_tree_add_uint(opt_tree, hf_pgm_opt_ccdata_res, tvb,
+ offset+3, 1, optdata.res);
+
+@@ -812,18 +888,27 @@
+ case PGM_OPT_PGMCC_FEEDBACK:{
+ pgm_opt_pgmcc_feedback_t optdata;
+
+- tvb_memcpy(tvb, (guint8 *)&optdata, offset, sizeof(optdata));
+ opt_tree = proto_item_add_subtree(tf, ett_pgm_opts_ccdata);
+
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_type,
+ tvb, offset, 1, genopts.type);
+
++ if (genopts.len < sizeof optdata) {
++ proto_tree_add_uint_format(opt_tree,
hf_pgm_genopt_len, tvb,
++ offset+1, 1, genopts.len,
++ "Length: %u (bogus, must be >= %lu)",
++ genopts.len,
++ (unsigned long) sizeof optdata);
++ break;
++ }
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_len, tvb,
+ offset+1, 1, genopts.len);
+
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_opx,
+ tvb, offset+2, 1, genopts.opx);
+
++ tvb_memcpy(tvb, (guint8 *)&optdata, offset, sizeof(optdata));
++
+ proto_tree_add_uint(opt_tree, hf_pgm_opt_ccfeedbk_res, tvb,
+ offset+3, 1, optdata.res);
+
+@@ -861,18 +946,27 @@
+ case PGM_OPT_NAK_BO_IVL:{
+ pgm_opt_nak_bo_ivl_t optdata;
+
+- tvb_memcpy(tvb, (guint8 *)&optdata, offset, sizeof(optdata));
+ opt_tree = proto_item_add_subtree(tf, ett_pgm_opts_nak_bo_ivl);
+
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_type,
+ tvb, offset, 1, genopts.type);
+
++ if (genopts.len < sizeof optdata) {
++ proto_tree_add_uint_format(opt_tree,
hf_pgm_genopt_len, tvb,
++ offset+1, 1, genopts.len,
++ "Length: %u (bogus, must be >= %lu)",
++ genopts.len,
++ (unsigned long) sizeof optdata);
++ break;
++ }
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_len, tvb,
+ offset+1, 1, genopts.len);
+
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_opx, tvb,
+ offset+2, 1, genopts.opx);
+
++ tvb_memcpy(tvb, (guint8 *)&optdata, offset, sizeof(optdata));
++
+ proto_tree_add_uint(opt_tree, hf_pgm_opt_nak_bo_ivl_res, tvb,
+ offset+3, 1, optdata.res);
+
+@@ -887,7 +981,6 @@
+ case PGM_OPT_NAK_BO_RNG:{
+ pgm_opt_nak_bo_rng_t optdata;
+
+- tvb_memcpy(tvb, (guint8 *)&optdata, offset, sizeof(optdata));
+ opt_tree = proto_item_add_subtree(tf, ett_pgm_opts_nak_bo_rng);
+
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_type,
+@@ -896,12 +989,22 @@
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_len, tvb,
+ offset+1, 1, genopts.len);
+
++ if (genopts.len < sizeof optdata) {
++ proto_tree_add_uint_format(opt_tree,
hf_pgm_genopt_len, tvb,
++ offset+1, 1, genopts.len,
++ "Length: %u (bogus, must be >= %lu)",
++ genopts.len,
++ (unsigned long) sizeof optdata);
++ break;
++ }
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_opx, tvb,
+ offset+2, 1, genopts.opx);
+
+ proto_tree_add_uint(opt_tree, hf_pgm_opt_nak_bo_rng_res, tvb,
+ offset+3, 1, optdata.res);
+
++ tvb_memcpy(tvb, (guint8 *)&optdata, offset, sizeof(optdata));
++
+ proto_tree_add_uint(opt_tree,
hf_pgm_opt_nak_bo_rng_min_bo_ivl, tvb,
+ offset+4, 4, g_ntohl(optdata.min_bo_ivl));
+
+@@ -913,18 +1016,27 @@
+ case PGM_OPT_REDIRECT:{
+ pgm_opt_redirect_t optdata;
+
+- tvb_memcpy(tvb, (guint8 *)&optdata, offset, sizeof(optdata));
+ opt_tree = proto_item_add_subtree(tf, ett_pgm_opts_redirect);
+
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_type,
+ tvb, offset, 1, genopts.type);
+
++ if (genopts.len < sizeof optdata) {
++ proto_tree_add_uint_format(opt_tree,
hf_pgm_genopt_len, tvb,
++ offset+1, 1, genopts.len,
++ "Length: %u (bogus, must be >= %lu)",
++ genopts.len,
++ (unsigned long) sizeof optdata);
++ break;
++ }
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_len, tvb,
+ offset+1, 1, genopts.len);
+
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_opx,
+ tvb, offset+2, 1, genopts.opx);
+
++ tvb_memcpy(tvb, (guint8 *)&optdata, offset, sizeof(optdata));
++
+ proto_tree_add_uint(opt_tree, hf_pgm_opt_redirect_res, tvb,
+ offset+3, 1, optdata.res);
+
+@@ -959,18 +1071,27 @@
+ case PGM_OPT_FRAGMENT:{
+ pgm_opt_fragment_t optdata;
+
+- tvb_memcpy(tvb, (guint8 *)&optdata, offset, sizeof(optdata));
+ opt_tree = proto_item_add_subtree(tf, ett_pgm_opts_fragment);
+
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_type,
+ tvb, offset, 1, genopts.type);
+
++ if (genopts.len < sizeof optdata) {
++ proto_tree_add_uint_format(opt_tree,
hf_pgm_genopt_len, tvb,
++ offset+1, 1, genopts.len,
++ "Length: %u (bogus, must be >= %lu)",
++ genopts.len,
++ (unsigned long) sizeof optdata);
++ break;
++ }
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_len, tvb,
+ offset+1, 1, genopts.len);
+
+ proto_tree_add_uint(opt_tree, hf_pgm_genopt_opx, tvb,
+ offset+2, 1, genopts.opx);
+
++ tvb_memcpy(tvb, (guint8 *)&optdata, offset, sizeof(optdata));
++
+ proto_tree_add_uint(opt_tree, hf_pgm_opt_fragment_res, tvb,
+ offset+3, 1, optdata.res);
+
+diff -Nau packet-radius.c.orig packet-radius.c
+--- packet-radius.c.orig 2003-07-19 16:48:57.000000000 +0200
++++ packet-radius.c 2004-04-15 10:54:39.670423128 +0200
+@@ -2789,6 +2789,7 @@
+ guint8 *reassembled_data = NULL;
+ int reassembled_data_len = 0;
+ int data_needed = 0;
++ char *attr_info_str = "(Invalid)";
+
+ if (avplength==0)
+ {
+@@ -2813,9 +2814,12 @@
+ * fields, so it must be >= 2.
+ */
+ if (tree) {
++ if (avptpstrval) {
++ attr_info_str = avptpstrval;
++ }
+ proto_tree_add_text(tree, tvb, offset, avph.avp_length,
+ "t:%s(%u) l:%u (length not >= 2)",
+- avptpstrval, avph.avp_type, avph.avp_length);
++ attr_info_str, avph.avp_type, avph.avp_length);
+ }
+ break;
+ }
@@ .
patch -p0 <<'@@ .'
Index: openpkg-src/ethereal/ethereal.spec
============================================================================
$ cvs diff -u -r1.11.2.3.2.1 -r1.11.2.3.2.2 ethereal.spec
--- openpkg-src/ethereal/ethereal.spec 29 Jul 2003 14:58:48 -0000
1.11.2.3.2.1
+++ openpkg-src/ethereal/ethereal.spec 16 Apr 2004 13:04:42 -0000
1.11.2.3.2.2
@@ -33,7 +33,7 @@
Group: Network
License: GPL
Version: 0.9.14
-Release: 1.3.0
+Release: 1.3.1
# package options
%option with_zlib no
@@ .
______________________________________________________________________
The OpenPKG Project www.openpkg.org
CVS Repository Commit List [EMAIL PROTECTED]