Ethereal-dev: Re: [ethereal-dev] SNMP Bug Report
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Guy Harris <gharris@xxxxxxxxxxxx>
Date: Sun, 25 Jun 2000 17:12:34 -0700
On Sun, Jun 25, 2000 at 04:22:16PM -0700, Guy Harris wrote: > It is probably worth dynamically allocating the buffer in the case where > it's not linked with "-lsnmp"; however, *all* we can do when it's linked > with "-lsnmp" is to make the fixed-length buffer longer. Well, we can do some more - we can, at least, try to guess an upper bound on the size of the string "sprint_value()" will generate, based on the size of the object and a guess as to how much it'll generate per item in the object. Here's a patch that does that (and that makes "packet-snmp.c" slightly more closely resemble the libsmi version); I've checked it in.
Index: packet-snmp.c =================================================================== RCS file: /usr/local/cvsroot/ethereal/packet-snmp.c,v retrieving revision 1.38 diff -c -r1.38 packet-snmp.c *** packet-snmp.c 2000/06/25 20:55:09 1.38 --- packet-snmp.c 2000/06/26 00:12:52 *************** *** 569,578 **** } #ifdef HAVE_SPRINT_VALUE ! static void ! format_value(gchar *buf, struct variable_list *variable, subid_t *variable_oid, guint variable_oid_length, gushort vb_type, guint vb_length) { variable->next_variable = NULL; variable->name = variable_oid; variable->name_length = variable_oid_length; --- 569,617 ---- } #ifdef HAVE_SPRINT_VALUE ! static gchar * ! format_var(struct variable_list *variable, subid_t *variable_oid, guint variable_oid_length, gushort vb_type, guint vb_length) { + gchar *buf; + + switch (vb_type) { + + case SNMP_INTEGER: + case SNMP_COUNTER: + case SNMP_GAUGE: + case SNMP_TIMETICKS: + /* We don't know how long this will be, but let's guess it + fits within 128 characters; that should be enough for an + integral value plus some sort of type indication. */ + buf = g_malloc(128); + break; + + case SNMP_OCTETSTR: + case SNMP_IPADDR: + case SNMP_OPAQUE: + case SNMP_NSAP: + case SNMP_BITSTR: + case SNMP_COUNTER64: + /* We don't know how long this will be, but let's guess it + fits within 128 characters plus 4 characters per octet. */ + buf = g_malloc(128 + 4*vb_length); + break; + + case SNMP_OBJECTID: + /* We don't know how long this will be, but let's guess it + fits within 128 characters plus 32 characters per subid + (10 digits plus period, or a subid name). */ + buf = g_malloc(1024 + 32*vb_length); + break; + + default: + /* Should not happen. */ + g_assert_not_reached(); + buf = NULL; + break; + } + variable->next_variable = NULL; variable->name = variable_oid; variable->name_length = variable_oid_length; *************** *** 612,617 **** --- 651,657 ---- case SNMP_OBJECTID: variable->type = VALTYPE_OBJECTID; + vb_length *= sizeof (subid_t); /* XXX - necessary? */ break; case SNMP_BITSTR: *************** *** 623,629 **** --- 663,671 ---- break; } variable->val_len = vb_length; + sprint_value(buf, variable_oid, variable_oid_length, variable); + return buf; } #endif *************** *** 648,654 **** subid_t *vb_oid; guint vb_oid_length; ! gchar vb_display_string[MAX_STRING_LEN]; /* TBC */ #ifdef HAVE_SPRINT_VALUE struct variable_list variable; --- 690,696 ---- subid_t *vb_oid; guint vb_oid_length; ! gchar *vb_display_string; #ifdef HAVE_SPRINT_VALUE struct variable_list variable; *************** *** 697,707 **** #elif defined(HAVE_SNMP_SNMP_H) variable.val.integer = &vb_integer_value; #endif ! format_value(vb_display_string, &variable, variable_oid, variable_oid_length, vb_type, vb_length); proto_tree_add_text(snmp_tree, NullTVB, offset, length, "Value: %s", vb_display_string); #else proto_tree_add_text(snmp_tree, NullTVB, offset, length, "Value: %s: %d (%#x)", vb_type_name, --- 739,750 ---- #elif defined(HAVE_SNMP_SNMP_H) variable.val.integer = &vb_integer_value; #endif ! vb_display_string = format_var(&variable, variable_oid, variable_oid_length, vb_type, vb_length); proto_tree_add_text(snmp_tree, NullTVB, offset, length, "Value: %s", vb_display_string); + g_free(vb_display_string); #else proto_tree_add_text(snmp_tree, NullTVB, offset, length, "Value: %s: %d (%#x)", vb_type_name, *************** *** 726,736 **** #elif defined(HAVE_SNMP_SNMP_H) variable.val.integer = &vb_uinteger_value; #endif ! format_value(vb_display_string, &variable, variable_oid, variable_oid_length, vb_type, vb_length); proto_tree_add_text(snmp_tree, NullTVB, offset, length, "Value: %s", vb_display_string); #else proto_tree_add_text(snmp_tree, NullTVB, offset, length, "Value: %s: %u (%#x)", vb_type_name, --- 769,780 ---- #elif defined(HAVE_SNMP_SNMP_H) variable.val.integer = &vb_uinteger_value; #endif ! vb_display_string = format_var(&variable, variable_oid, variable_oid_length, vb_type, vb_length); proto_tree_add_text(snmp_tree, NullTVB, offset, length, "Value: %s", vb_display_string); + g_free(vb_display_string); #else proto_tree_add_text(snmp_tree, NullTVB, offset, length, "Value: %s: %u (%#x)", vb_type_name, *************** *** 753,763 **** if (snmp_tree) { #ifdef HAVE_SPRINT_VALUE variable.val.string = vb_octet_string; ! format_value(vb_display_string, &variable, variable_oid, variable_oid_length, vb_type, vb_length); proto_tree_add_text(snmp_tree, NullTVB, offset, length, "Value: %s", vb_display_string); #else /* * If some characters are not printable, display --- 797,808 ---- if (snmp_tree) { #ifdef HAVE_SPRINT_VALUE variable.val.string = vb_octet_string; ! vb_display_string = format_var(&variable, variable_oid, variable_oid_length, vb_type, vb_length); proto_tree_add_text(snmp_tree, NullTVB, offset, length, "Value: %s", vb_display_string); + g_free(vb_display_string); #else /* * If some characters are not printable, display *************** *** 774,779 **** --- 819,825 ---- * character, before we got to the end * of the string. */ + vb_display_string = g_malloc(4*vb_length); buf = &vb_display_string[0]; len = sprintf(buf, "%03u", vb_octet_string[0]); buf += len; *************** *** 785,790 **** --- 831,837 ---- proto_tree_add_text(snmp_tree, NullTVB, offset, length, "Value: %s: %s", vb_type_name, vb_display_string); + g_free(vb_display_string); } else { proto_tree_add_text(snmp_tree, NullTVB, offset, length, "Value: %s: %.*s", vb_type_name, *************** *** 815,830 **** if (snmp_tree) { #ifdef HAVE_SPRINT_VALUE variable.val.objid = vb_oid; ! format_value(vb_display_string, &variable, variable_oid, variable_oid_length, vb_type, ! vb_length*sizeof (subid_t)); proto_tree_add_text(snmp_tree, NullTVB, offset, length, "Value: %s", vb_display_string); #else format_oid(vb_display_string, vb_oid, vb_oid_length); proto_tree_add_text(snmp_tree, NullTVB, offset, length, "Value: %s: %s", vb_type_name, vb_display_string); #endif } g_free(vb_oid); break; --- 862,881 ---- if (snmp_tree) { #ifdef HAVE_SPRINT_VALUE variable.val.objid = vb_oid; ! vb_display_string = format_var(&variable, variable_oid, variable_oid_length, vb_type, ! vb_length); proto_tree_add_text(snmp_tree, NullTVB, offset, length, "Value: %s", vb_display_string); #else + /* This fits with 11 characters per subid (10 digits + plus period). */ + vb_display_string = g_malloc(11*vb_oid_length); format_oid(vb_display_string, vb_oid, vb_oid_length); proto_tree_add_text(snmp_tree, NullTVB, offset, length, "Value: %s: %s", vb_type_name, vb_display_string); #endif + g_free(vb_display_string); } g_free(vb_oid); break;
- References:
- [ethereal-dev] SNMP Bug Report
- From: Thomas Morin
- Re: [ethereal-dev] SNMP Bug Report
- From: Jochen Friedrich
- Re: [ethereal-dev] SNMP Bug Report
- From: Guy Harris
- Re: [ethereal-dev] SNMP Bug Report
- From: Guy Harris
- [ethereal-dev] SNMP Bug Report
- Prev by Date: Re: [ethereal-dev] SNMP Bug Report
- Next by Date: Re: [ethereal-dev] packet-snmp.c and libsmi
- Previous by thread: Re: [ethereal-dev] SNMP Bug Report
- Next by thread: [ethereal-dev] compile ethereal
- Index(es):