from Luis Ontanon:
authoretxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7>
Thu, 4 Mar 2010 13:54:21 +0000 (13:54 +0000)
committeretxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7>
Thu, 4 Mar 2010 13:54:21 +0000 (13:54 +0000)
calculate the value of a ber integer by hand instead of just using
proto_tree_add_item().
https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=3230

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@32113 f5534014-38df-0310-8fa8-9805f1628bb7

asn1/snmp/packet-snmp-template.c
epan/dissectors/packet-snmp.c

index 5703bfde5f4490312db3966b69a9623e3f6be00c..66d946b69334b957ed8f85229e42f391cca05c74 100644 (file)
@@ -750,10 +750,31 @@ indexing_done:
        } else {
                switch(ber_class|(tag<<4)) {
                        case BER_CLASS_UNI|(BER_UNI_TAG_INTEGER<<4):
-                               max_len = 4; min_len = 1;
-                               if (value_len > (guint)max_len && value_len < (guint)min_len) format_error = BER_WRONG_LENGTH;
-                               hfid = hf_snmp_integer32_value;
-                               break;
+                       {
+                               gint64 val=0;
+                               unsigned offset = value_offset;
+                               unsigned i;
+                               
+                               max_len = 5; min_len = 1;
+                               if (value_len > (guint)max_len && value_len < (guint)min_len) {
+                                       format_error = BER_WRONG_LENGTH;
+                                       break;
+                               }
+                               
+                               if(value_len > 0) {
+                                       /* extend sign bit */
+                                       if(tvb_get_guint8(tvb, offset)&0x80){
+                                               val=-1;
+                                       }
+                                       for(i=0;i<value_len;i++){
+                                               val=(val<<8)|tvb_get_guint8(tvb, offset);
+                                               offset++;
+                                       }
+                               }
+                               proto_tree_add_int64(pt_varbind, hf_snmp_integer32_value, tvb,value_offset,value_len, val);
+
+                               goto already_added;
+                       }
                        case BER_CLASS_UNI|(BER_UNI_TAG_OCTETSTRING<<4):
                                hfid = hf_snmp_octetstring_value;
                                break;
@@ -804,6 +825,8 @@ indexing_done:
                        pi_value = proto_tree_add_item(pt_varbind,hfid,tvb,value_offset,value_len,FALSE);
                        expert_add_info_format(actx->pinfo, pi_value, PI_UNDECODED, PI_NOTE, "Unresolved value, Missing MIB");
                }
+               
+already_added:
                oid_info_is_ok = FALSE;
        }
 
index 9522ead85f1cc8ad021bdd4edf785d3510666f0e..c8b69c23849622135fa2aeb59d31b5964cc45ff5 100644 (file)
@@ -852,10 +852,31 @@ indexing_done:
        } else {
                switch(ber_class|(tag<<4)) {
                        case BER_CLASS_UNI|(BER_UNI_TAG_INTEGER<<4):
-                               max_len = 4; min_len = 1;
-                               if (value_len > (guint)max_len && value_len < (guint)min_len) format_error = BER_WRONG_LENGTH;
-                               hfid = hf_snmp_integer32_value;
-                               break;
+                       {
+                               gint64 val=0;
+                               unsigned offset = value_offset;
+                               unsigned i;
+                               
+                               max_len = 5; min_len = 1;
+                               if (value_len > (guint)max_len && value_len < (guint)min_len) {
+                                       format_error = BER_WRONG_LENGTH;
+                                       break;
+                               }
+                               
+                               if(value_len > 0) {
+                                       /* extend sign bit */
+                                       if(tvb_get_guint8(tvb, offset)&0x80){
+                                               val=-1;
+                                       }
+                                       for(i=0;i<value_len;i++){
+                                               val=(val<<8)|tvb_get_guint8(tvb, offset);
+                                               offset++;
+                                       }
+                               }
+                               proto_tree_add_int64(pt_varbind, hf_snmp_integer32_value, tvb,value_offset,value_len, val);
+
+                               goto already_added;
+                       }
                        case BER_CLASS_UNI|(BER_UNI_TAG_OCTETSTRING<<4):
                                hfid = hf_snmp_octetstring_value;
                                break;
@@ -906,6 +927,8 @@ indexing_done:
                        pi_value = proto_tree_add_item(pt_varbind,hfid,tvb,value_offset,value_len,FALSE);
                        expert_add_info_format(actx->pinfo, pi_value, PI_UNDECODED, PI_NOTE, "Unresolved value, Missing MIB");
                }
+               
+already_added:
                oid_info_is_ok = FALSE;
        }
 
@@ -2663,7 +2686,7 @@ static void dissect_SMUX_PDUs_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, pro
 
 
 /*--- End of included file: packet-snmp-fn.c ---*/
-#line 1443 "packet-snmp-template.c"
+#line 1466 "packet-snmp-template.c"
 
 
 guint
@@ -3511,7 +3534,7 @@ void proto_register_snmp(void) {
         "snmp.T_operation", HFILL }},
 
 /*--- End of included file: packet-snmp-hfarr.c ---*/
-#line 2026 "packet-snmp-template.c"
+#line 2049 "packet-snmp-template.c"
   };
 
   /* List of subtrees */
@@ -3551,7 +3574,7 @@ void proto_register_snmp(void) {
     &ett_snmp_RReqPDU_U,
 
 /*--- End of included file: packet-snmp-ettarr.c ---*/
-#line 2042 "packet-snmp-template.c"
+#line 2065 "packet-snmp-template.c"
   };
   module_t *snmp_module;