aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2006-05-15 17:58:39 +0000
committerGuy Harris <guy@alum.mit.edu>2006-05-15 17:58:39 +0000
commitaa4b59de6f32ed9708d6d54b64404d257a06279e (patch)
tree2aeba59a2e175f67e10ee411ec33d50b389e6ac7
parentd31072a9a2e8d9f75fbd65cd8e0bc26ea40e566a (diff)
Don't throw an exception in oid_to_subid_buf() if the generated OID is
zero-length - oid_to_subid_buf() can be called when we're not in the middle of a dissection, and throwing a "dissector bug" assertion in that case is itself a bug. svn path=/trunk/; revision=18164
-rw-r--r--asn1/snmp/packet-snmp-template.c70
-rw-r--r--epan/dissectors/packet-snmp.c78
2 files changed, 72 insertions, 76 deletions
diff --git a/asn1/snmp/packet-snmp-template.c b/asn1/snmp/packet-snmp-template.c
index 036be539a6..9d3663a1cd 100644
--- a/asn1/snmp/packet-snmp-template.c
+++ b/asn1/snmp/packet-snmp-template.c
@@ -342,42 +342,40 @@ snmp_tag_cls2syntax ( guint tag, guint cls, gushort *syntax)
}
int oid_to_subid_buf(const guint8 *oid, gint oid_len, subid_t *buf, int buf_len) {
- int i, out_len;
- guint8 byte;
- guint32 value;
- gboolean is_first;
-
- value=0; out_len = 0; byte =0; is_first = TRUE;
- for (i=0; i<oid_len; i++){
- if (out_len >= buf_len)
- break;
- byte = oid[i];
- value = (value << 7) | (byte & 0x7F);
- if (byte & 0x80) {
- continue;
- }
- if (is_first) {
- if ( value<40 ){
- buf[0] = 0;
- buf[1] = value;
- }else if ( value < 80 ){
- buf[0] = 1;
- buf[1] = value - 40;
- }else {
- buf[0] = 2;
- buf[1] = value - 80;
- }
- out_len= out_len+2;
- is_first = FALSE;
- }else{
- buf[out_len++] = value;
- }
- value = 0;
- }
- if (out_len == 0)
- DISSECTOR_ASSERT_NOT_REACHED();
-
- return out_len;
+ int i, out_len;
+ guint8 byte;
+ guint32 value;
+ gboolean is_first;
+
+ value=0; out_len = 0; byte =0; is_first = TRUE;
+ for (i=0; i<oid_len; i++){
+ if (out_len >= buf_len)
+ break;
+ byte = oid[i];
+ value = (value << 7) | (byte & 0x7F);
+ if (byte & 0x80) {
+ continue;
+ }
+ if (is_first) {
+ if ( value<40 ){
+ buf[0] = 0;
+ buf[1] = value;
+ }else if ( value < 80 ){
+ buf[0] = 1;
+ buf[1] = value - 40;
+ }else {
+ buf[0] = 2;
+ buf[1] = value - 80;
+ }
+ out_len= out_len+2;
+ is_first = FALSE;
+ }else{
+ buf[out_len++] = value;
+ }
+ value = 0;
+ }
+
+ return out_len;
}
gchar *
diff --git a/epan/dissectors/packet-snmp.c b/epan/dissectors/packet-snmp.c
index 685b952ac0..f356da6dfc 100644
--- a/epan/dissectors/packet-snmp.c
+++ b/epan/dissectors/packet-snmp.c
@@ -1,6 +1,6 @@
/* Do not modify this file. */
/* It is created automatically by the ASN.1 to Ethereal dissector compiler */
-/* .\packet-snmp.c */
+/* ./packet-snmp.c */
/* ../../tools/asn2eth.py -X -b -e -p snmp -c snmp.cnf -s packet-snmp-template snmp.asn */
/* Input file: packet-snmp-template.c */
@@ -467,42 +467,40 @@ snmp_tag_cls2syntax ( guint tag, guint cls, gushort *syntax)
}
int oid_to_subid_buf(const guint8 *oid, gint oid_len, subid_t *buf, int buf_len) {
- int i, out_len;
- guint8 byte;
- guint32 value;
- gboolean is_first;
-
- value=0; out_len = 0; byte =0; is_first = TRUE;
- for (i=0; i<oid_len; i++){
- if (out_len >= buf_len)
- break;
- byte = oid[i];
- value = (value << 7) | (byte & 0x7F);
- if (byte & 0x80) {
- continue;
- }
- if (is_first) {
- if ( value<40 ){
- buf[0] = 0;
- buf[1] = value;
- }else if ( value < 80 ){
- buf[0] = 1;
- buf[1] = value - 40;
- }else {
- buf[0] = 2;
- buf[1] = value - 80;
- }
- out_len= out_len+2;
- is_first = FALSE;
- }else{
- buf[out_len++] = value;
- }
- value = 0;
- }
- if (out_len == 0)
- DISSECTOR_ASSERT_NOT_REACHED();
-
- return out_len;
+ int i, out_len;
+ guint8 byte;
+ guint32 value;
+ gboolean is_first;
+
+ value=0; out_len = 0; byte =0; is_first = TRUE;
+ for (i=0; i<oid_len; i++){
+ if (out_len >= buf_len)
+ break;
+ byte = oid[i];
+ value = (value << 7) | (byte & 0x7F);
+ if (byte & 0x80) {
+ continue;
+ }
+ if (is_first) {
+ if ( value<40 ){
+ buf[0] = 0;
+ buf[1] = value;
+ }else if ( value < 80 ){
+ buf[0] = 1;
+ buf[1] = value - 40;
+ }else {
+ buf[0] = 2;
+ buf[1] = value - 80;
+ }
+ out_len= out_len+2;
+ is_first = FALSE;
+ }else{
+ buf[out_len++] = value;
+ }
+ value = 0;
+ }
+
+ return out_len;
}
gchar *
@@ -2678,7 +2676,7 @@ static void dissect_SMUX_PDUs_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree
/*--- End of included file: packet-snmp-fn.c ---*/
-#line 1028 "packet-snmp-template.c"
+#line 1026 "packet-snmp-template.c"
guint
dissect_snmp_pdu(tvbuff_t *tvb, int offset, packet_info *pinfo,
@@ -3368,7 +3366,7 @@ void proto_register_snmp(void) {
"RReqPDU/operation", HFILL }},
/*--- End of included file: packet-snmp-hfarr.c ---*/
-#line 1381 "packet-snmp-template.c"
+#line 1379 "packet-snmp-template.c"
};
/* List of subtrees */
@@ -3406,7 +3404,7 @@ void proto_register_snmp(void) {
&ett_snmp_RReqPDU,
/*--- End of included file: packet-snmp-ettarr.c ---*/
-#line 1390 "packet-snmp-template.c"
+#line 1388 "packet-snmp-template.c"
};
module_t *snmp_module;