diff options
author | Gerald Combs <gerald@wireshark.org> | 2005-04-26 22:06:04 +0000 |
---|---|---|
committer | Gerald Combs <gerald@wireshark.org> | 2005-04-26 22:06:04 +0000 |
commit | 310c8a84347d85542e8f2bfa0344a17b800246a3 (patch) | |
tree | 64b1019d73e415ea7abc7a9247962df4b04ec8b8 /epan/dissectors | |
parent | e1a597eccfa22db82e39d45278f7e29967239041 (diff) |
Add a slew of tvb_ensure_bytes_exist() calls. This should probably be
converted to use the new-style ASN.1 code. Fixes bug 102.
svn path=/trunk/; revision=14193
Diffstat (limited to 'epan/dissectors')
-rw-r--r-- | epan/dissectors/packet-pres.c | 78 |
1 files changed, 75 insertions, 3 deletions
diff --git a/epan/dissectors/packet-pres.c b/epan/dissectors/packet-pres.c index 141d759d8d..77a638685f 100644 --- a/epan/dissectors/packet-pres.c +++ b/epan/dissectors/packet-pres.c @@ -226,6 +226,7 @@ call_acse_dissector(tvbuff_t *tvb, gint offset, gint param_len, /* No - display as data */ if (tree) { + tvb_ensure_bytes_exist(tvb, offset, param_len); proto_tree_add_text(param_tree, tvb, offset, param_len, "No ACSE dissector available"); } @@ -287,6 +288,7 @@ static int read_length(ASN1_SCK *a, proto_tree *tree, int hf_id, guint *len) { if (tree) { + tvb_ensure_bytes_exist(a->tvb, start, 0); proto_tree_add_text(tree, a->tvb, start, 0, "%s: ERROR: Couldn't parse length: %s", proto_registrar_get_name(hf_id), asn1_err_to_str(ret)); @@ -297,9 +299,11 @@ static int read_length(ASN1_SCK *a, proto_tree *tree, int hf_id, guint *len) if (len) *len = length; - if (hf_id) + if (hf_id) { + tvb_ensure_bytes_exist(a->tvb, start, a->offset-start); proto_tree_add_uint(tree, hf_id, a->tvb, start, a->offset-start, length); + } return ASN1_ERR_NOERROR; } @@ -315,6 +319,7 @@ static int read_integer_value(ASN1_SCK *a, proto_tree *tree, int hf_id, { if (tree) { + tvb_ensure_bytes_exist(a->tvb, start, 0); proto_tree_add_text(tree, a->tvb, start, 0, "%s: ERROR: Couldn't parse value: %s", proto_registrar_get_name(hf_id), asn1_err_to_str(ret)); @@ -325,9 +330,11 @@ static int read_integer_value(ASN1_SCK *a, proto_tree *tree, int hf_id, if (i) *i = integer; - if (hf_id) + if (hf_id) { + tvb_ensure_bytes_exist(a->tvb, start, a->offset-start); temp_item = proto_tree_add_uint(tree, hf_id, a->tvb, start, a->offset-start, integer); + } if (new_item) *new_item = temp_item; @@ -349,6 +356,7 @@ static int read_integer(ASN1_SCK *a, proto_tree *tree, int hf_id, { if (tree) { + tvb_ensure_bytes_exist(a->tvb, start, 0); proto_tree_add_text(tree, a->tvb, start, 0, "%s: ERROR: Couldn't parse header: %s", (hf_id != -1) ? proto_registrar_get_name(hf_id) : "LDAP message", @@ -369,6 +377,8 @@ show_integer(ASN1_SCK *asn,proto_tree *pres_tree,tvbuff_t *tvb,int int ret; int save_len = item_len; int off = *offset; + + tvb_ensure_bytes_exist(tvb, *offset, item_len); itm = proto_tree_add_text(pres_tree, tvb, *offset, item_len, "Integer"); pres_tree_itm = proto_item_add_subtree(itm, ett_pres_itm); @@ -376,6 +386,7 @@ show_integer(ASN1_SCK *asn,proto_tree *pres_tree,tvbuff_t *tvb,int if (ret == ASN1_ERR_NOERROR ) { *offset = asn->offset; + tvb_ensure_bytes_exist(tvb, (*offset)-item_len, item_len); itm = proto_tree_add_text(pres_tree_itm, tvb, (*offset)-item_len, item_len, "Integer value: %u",item_len); @@ -399,11 +410,13 @@ show_presentation_requirements(ASN1_SCK *asn,proto_tree *pres_tree,tvbuff_t if( ( length = tvb_reported_length_remaining(tvb, *offset)) < (asn->offset -*offset)+ item_len ) { + tvb_ensure_bytes_exist(tvb, *offset, item_len); proto_tree_add_text(pres_tree, tvb, *offset, item_len, "Wrong Item.Need %u bytes but have %u", item_len,length); return; } + tvb_ensure_bytes_exist(tvb, *offset,(asn->offset -*offset)+item_len); itm = proto_tree_add_text(pres_tree, tvb, *offset,(asn->offset -*offset)+ item_len, val_to_str(tag, sequence_top_vals,"Unknown item (0x%02x)")); @@ -430,11 +443,13 @@ show_protocol_version(ASN1_SCK *asn,proto_tree *pres_tree,tvbuff_t *tvb,int if( ( length = tvb_reported_length_remaining(tvb, *offset)) < (asn->offset -*offset)+ item_len ) { + tvb_ensure_bytes_exist(tvb, *offset, item_len); proto_tree_add_text(pres_tree, tvb, *offset, item_len, "Wrong Item.Need %u bytes but have %u", item_len,length); return; } + tvb_ensure_bytes_exist(tvb, *offset,(asn->offset -*offset)+item_len); itm = proto_tree_add_text(pres_tree, tvb, *offset,(asn->offset -*offset)+ item_len, val_to_str(tag, sequence_top_vals,"Unknown item (0x%02x)")); @@ -464,6 +479,7 @@ print_oid_value(ASN1_SCK *asn,proto_tree *pres_tree,tvbuff_t *tvb,int } length = asn->offset - start; display_string = format_oid(oid, len); + tvb_ensure_bytes_exist(tvb, *offset,length); proto_tree_add_text(pres_tree, tvb, *offset,length,"Value:%s", display_string); g_free(display_string); @@ -490,6 +506,7 @@ item_len) } length = asn->offset - start; display_string = format_oid(oid, len); + tvb_ensure_bytes_exist(tvb, *offset,length); proto_tree_add_text(pres_tree, tvb, *offset,length,"Value:%s", display_string); g_free(display_string); @@ -505,6 +522,7 @@ print_value(ASN1_SCK *asn,proto_tree *pres_tree,tvbuff_t *tvb,int char tmp[MAXSTRING]; *offset = asn->offset; /* align to data*/ string_to_hex(tvb_get_ptr(tvb,*offset,item_len),tmp,item_len); + tvb_ensure_bytes_exist(tvb, *offset, item_len); proto_tree_add_text(pres_tree, tvb, *offset, item_len, tmp); (*offset)=start+item_len; asn->offset = (*offset); @@ -567,6 +585,7 @@ show_presentation_context_definition_result_seq(ASN1_SCK *asn,proto_tree if( ( length =tvb_reported_length_remaining(tvb, *offset)) < new_item_len ) { + tvb_ensure_bytes_exist(tvb, *offset, new_item_len); proto_tree_add_text(pres_tree, tvb, *offset, new_item_len, "Wrong item.Need %u bytes but have %u", new_item_len,length); (*offset)=start+item_len; @@ -574,6 +593,7 @@ new_item_len ) return ; } header_len = asn->offset - (*offset) +1; + tvb_ensure_bytes_exist(tvb, *offset-1, new_item_len+(asn->offset-*offset)+1); ms = proto_tree_add_text(pres_tree, tvb, *offset-1, new_item_len+(asn->offset-*offset)+1, val_to_str(type, sequence_list_result_vals, @@ -589,6 +609,7 @@ new_item_len+(asn->offset-*offset)+1, proto_tree *pres_tree_pr = NULL; proto_item *pr; int value = get_integer_value(asn,new_item_len,offset); + tvb_ensure_bytes_exist(tvb, *offset, new_item_len+(asn->offset-*offset)); pr = proto_tree_add_text(pres_tree_ms, tvb, *offset, new_item_len+(asn->offset-*offset), val_to_str(value ,sequence_list_result_values_vals, @@ -606,6 +627,7 @@ new_item_len+(asn->offset-*offset), break; default: + tvb_ensure_bytes_exist(tvb, *offset, new_item_len+(asn->offset-*offset)); proto_tree_add_text(pres_tree, tvb, *offset, new_item_len+(asn->offset-*offset), "Unknown asn.1 parameter: (0x%02x)", type); @@ -652,6 +674,7 @@ show_presentation_context_definition_seq(ASN1_SCK *asn,proto_tree if( ( length =tvb_reported_length_remaining(tvb, *offset)) < new_item_len ) { + tvb_ensure_bytes_exist(tvb, *offset, new_item_len); proto_tree_add_text(pres_tree, tvb, *offset, new_item_len, "Wrong item.Need %u bytes but have %u", new_item_len,length); (*offset)=start+item_len; @@ -659,6 +682,7 @@ new_item_len ) return ; } header_len = asn->offset - (*offset) +1; + tvb_ensure_bytes_exist(tvb, *offset-1, new_item_len+(asn->offset-*offset)+1); ms = proto_tree_add_text(pres_tree, tvb, *offset-1, new_item_len+(asn->offset-*offset)+1, val_to_str(type, sequence_list_vals, @@ -679,6 +703,7 @@ new_item_len+(asn->offset-*offset)+1, print_oid(asn,pres_tree_ms,tvb,offset,new_item_len); break; default: + tvb_ensure_bytes_exist(tvb, *offset, new_item_len+(asn->offset-*offset)); proto_tree_add_text(pres_tree, tvb, *offset, new_item_len+(asn->offset-*offset), "Unknown asn.1 parameter: (0x%02x)", type); @@ -723,6 +748,7 @@ show_fully_encoded_seq(ASN1_SCK *asn,proto_tree *pres_tree,tvbuff_t *tvb,int if( ( length =tvb_reported_length_remaining(tvb, *offset)) < new_item_len ) { + tvb_ensure_bytes_exist(tvb, *offset, new_item_len); proto_tree_add_text(pres_tree, tvb, *offset, new_item_len, "Wrong item.Need %u bytes but have %u", new_item_len,length); (*offset)=start+item_len; @@ -734,6 +760,7 @@ new_item_len ) new_item_len = length-1; /* can't get length from asn1 tag. Use rest of the pdu len. */ } header_len = asn->offset - (*offset) +1; + tvb_ensure_bytes_exist(tvb, *offset-1, new_item_len+(asn->offset-*offset)+1); ms = proto_tree_add_text(pres_tree, tvb, *offset-1, new_item_len+(asn->offset-*offset)+1, val_to_str(type, presentation_data_values, @@ -755,6 +782,7 @@ new_item_len+(asn->offset-*offset)+1, { proto_item *acse_ms; /* yes, we have to call ACSE dissector */ + tvb_ensure_bytes_exist(tvb, *offset,new_item_len+(asn->offset-*offset)); acse_ms = proto_tree_add_text(pres_tree_ms, tvb, *offset,new_item_len+(asn->offset-*offset), "User data"); @@ -768,6 +796,7 @@ new_item_len+(asn->offset-*offset)+1, { proto_item *acse_ms; /* yes, we have to call ACSE dissector */ + tvb_ensure_bytes_exist(tvb, *offset, new_item_len+(asn->offset-*offset)); acse_ms = proto_tree_add_text(pres_tree_ms, tvb, *offset, new_item_len+(asn->offset-*offset), "User data"); @@ -780,6 +809,7 @@ new_item_len+(asn->offset-*offset), print_value(asn,pres_tree_ms,tvb,offset,new_item_len); break; default: + tvb_ensure_bytes_exist(tvb, *offset, new_item_len+(asn->offset-*offset)); proto_tree_add_text(pres_tree, tvb, *offset, new_item_len+(asn->offset-*offset), "Unknown asn.1 parameter: (0x%02x)", type); @@ -810,6 +840,7 @@ show_fully_encoded_data(ASN1_SCK *asn,proto_tree *pres_tree,tvbuff_t /* do we have enough bytes to dissect ? */ if( ( length =tvb_reported_length_remaining(tvb, *offset)) < item_len ) { + tvb_ensure_bytes_exist(tvb, *offset, item_len); proto_tree_add_text(pres_tree_pc, tvb, *offset, item_len, "Wrong item.Need %u bytes but have %u", item_len,length); /* align the pointer */ @@ -842,6 +873,7 @@ ASN1_ERR_NOERROR) if( ( length =tvb_reported_length_remaining(tvb, *offset)) < new_item_len ) { + tvb_ensure_bytes_exist(tvb, *offset, new_item_len); proto_tree_add_text(pres_tree_pc, tvb, *offset, new_item_len, "Wrong item.Need %u bytes but have %u", new_item_len,length); /* align the pointer */ @@ -854,6 +886,7 @@ new_item_len ) /* check if really do have what to dissect */ new_item_len = length-1; } + tvb_ensure_bytes_exist(tvb, *offset-1, new_item_len+(asn->offset-*offset)+1); ms = proto_tree_add_text(pres_tree_pc, tvb, *offset-1, new_item_len+(asn->offset-*offset)+1, val_to_str(type, presentation_context_definition_vals, @@ -871,6 +904,7 @@ new_item_len+(asn->offset-*offset)+1, break; default: + tvb_ensure_bytes_exist(tvb, *offset, new_item_len+(asn->offset-*offset)); proto_tree_add_text(pres_tree_ms, tvb, *offset, new_item_len+(asn->offset-*offset), "Unknown asn.1 parameter: (0x%02x)", type); @@ -898,6 +932,7 @@ show_session_provider_abort(ASN1_SCK *asn,proto_tree *pres_tree,tvbuff_t /* do we have enough bytes to dissect this item ? */ + tvb_ensure_bytes_exist(tvb, *offset, item_len); if( ( length =tvb_reported_length_remaining(tvb, *offset)) < item_len ) { proto_tree_add_text(pres_tree, tvb, *offset, item_len, @@ -916,6 +951,7 @@ show_session_provider_abort(ASN1_SCK *asn,proto_tree *pres_tree,tvbuff_t *offset = asn->offset; return; } + tvb_ensure_bytes_exist(tvb, *offset,ABORT_REASON_LEN); itu = proto_tree_add_text(pres_tree_pp, tvb, *offset,ABORT_REASON_LEN, "Abort reason"); pres_tree_pc = proto_item_add_subtree(itu, ett_pres_ms); @@ -933,6 +969,7 @@ ASN1_ERR_NOERROR) value = get_integer_value(asn,new_item_len,offset); + tvb_ensure_bytes_exist(tvb, *offset+1,new_item_len); proto_tree_add_text(pres_tree_pc, tvb, *offset+1,new_item_len, val_to_str(value, provider_abort_values_vals,"Unknown item (0x%02x)")); item_len-=(asn->offset-*offset)+new_item_len; @@ -941,6 +978,7 @@ ASN1_ERR_NOERROR) /* do we have Event identifier ? */ if(item_len > 0) { + tvb_ensure_bytes_exist(tvb, *offset,item_len); itu = proto_tree_add_text(pres_tree_pp, tvb, *offset,item_len, "Event identifier"); pres_tree_pc = proto_item_add_subtree(itu, ett_pres_ms); @@ -958,6 +996,7 @@ ASN1_ERR_NOERROR) /* try to get Event identifier */ value = get_integer_value(asn,new_item_len,offset); + tvb_ensure_bytes_exist(tvb, *offset+1,new_item_len); proto_tree_add_text(pres_tree_pc, tvb, *offset+1,new_item_len, val_to_str(value, event_identifier_values_vals,"Unknown item (0x%02x)")); item_len-=(asn->offset-*offset)+new_item_len; @@ -976,9 +1015,11 @@ show_user_data(ASN1_SCK *asn,proto_tree *pres_tree,tvbuff_t *tvb,int guint start = asn->offset; guint item_length = item_len; + tvb_ensure_bytes_exist(tvb, *offset,(asn->offset -*offset)+item_len); itm = proto_tree_add_text(pres_tree, tvb, *offset,(asn->offset -*offset)+ item_len, "User data"); pres_tree_ud = proto_item_add_subtree(itm, ett_pres_ms); + tvb_ensure_bytes_exist(tvb, *offset,item_len+(asn->offset-*offset)); itu = proto_tree_add_text(pres_tree_ud, tvb, *offset,item_len+(asn->offset-*offset), val_to_str(tag, user_data_values_vals,"Unknown item (0x%02x)")); @@ -1016,6 +1057,7 @@ show_presentation_context_definition(ASN1_SCK *asn,proto_tree guint start = asn->offset; guint item_length = item_len; + tvb_ensure_bytes_exist(tvb, *offset,item_len+(asn->offset-*offset)); itm = proto_tree_add_text(pres_tree, tvb, *offset,item_len+(asn->offset-*offset), val_to_str(tag, sequence_top_vals,"Unknown item (0x%02x)")); @@ -1024,6 +1066,7 @@ show_presentation_context_definition(ASN1_SCK *asn,proto_tree /* do we have enough bytes to dissect ? */ if( ( length =tvb_reported_length_remaining(tvb, *offset)) < item_len ) { + tvb_ensure_bytes_exist(tvb, *offset, item_len); proto_tree_add_text(pres_tree_pc, tvb, *offset, item_len, "Wrong item.Need %u bytes but have %u", item_len,length); /* align the pointer */ @@ -1056,6 +1099,7 @@ ASN1_ERR_NOERROR) if( ( length =tvb_reported_length_remaining(tvb, *offset)) < new_item_len ) { + tvb_ensure_bytes_exist(tvb, *offset, new_item_len); proto_tree_add_text(pres_tree_pc, tvb, *offset, new_item_len, "Wrong item.Need %u bytes but have %u", new_item_len,length); /* align the pointer */ @@ -1063,6 +1107,7 @@ new_item_len ) asn->offset = (*offset); return ; } + tvb_ensure_bytes_exist(tvb, *offset-1, new_item_len+(asn->offset-*offset)+1); ms = proto_tree_add_text(pres_tree_pc, tvb, *offset-1, new_item_len+(asn->offset-*offset)+1, val_to_str(type, presentation_context_definition_vals, @@ -1088,6 +1133,7 @@ new_item_len+(asn->offset-*offset)+1, break; default: + tvb_ensure_bytes_exist(tvb, *offset, new_item_len+(asn->offset-*offset)); proto_tree_add_text(pres_tree_ms, tvb, *offset, new_item_len+(asn->offset-*offset), "Unknown asn.1 parameter: (0x%02x)", type); @@ -1145,9 +1191,11 @@ static int read_string_value(ASN1_SCK *a, proto_tree *tree, int hf_id, else string = "(null)"; - if (hf_id) + if (hf_id) { + tvb_ensure_bytes_exist(a->tvb, start, a->offset); temp_item = proto_tree_add_string(tree, hf_id, a->tvb, start, a->offset - start, string); + } if (new_item) *new_item = temp_item; @@ -1170,11 +1218,13 @@ show_provider_reason(ASN1_SCK *asn,proto_tree *pres_tree,tvbuff_t *tvb,int int value=0; int new_item_len = item_len+(asn->offset-*offset); + tvb_ensure_bytes_exist(tvb, *offset, new_item_len); ms = proto_tree_add_text(pres_tree, tvb, *offset, new_item_len, val_to_str(type, sequence_top_vals, "Unknown item (0x%02x)")); pres_tree_ms = proto_item_add_subtree(ms, ett_pres_ms); value = get_integer_value(asn,item_len,offset); + tvb_ensure_bytes_exist(tvb, *offset, new_item_len); pr = proto_tree_add_text(pres_tree_ms, tvb, *offset, new_item_len, val_to_str(value, provider_reason_values_vals, "Unknown item (0x%02x)")); @@ -1191,6 +1241,7 @@ show_presentation_selector (ASN1_SCK *asn,proto_tree *pres_tree,tvbuff_t int ret; char *s; + tvb_ensure_bytes_exist(tvb, *offset, item_len+(asn->offset-*offset)); ms = proto_tree_add_text(pres_tree, tvb, *offset, item_len+(asn->offset-*offset), val_to_str(type, sequence_top_vals, @@ -1203,6 +1254,7 @@ item_len+(asn->offset-*offset), *offset+(asn->offset-*offset), item_len); if(ret == ASN1_ERR_NOERROR) { + tvb_ensure_bytes_exist(tvb, *offset+2, item_len); if( item_len) { proto_tree_add_text(pres_tree_ms, tvb, *offset+2, item_len, @@ -1236,6 +1288,7 @@ show_sequence_top(ASN1_SCK *asn,proto_tree *pres_tree,tvbuff_t /* do we have enough bytes to dissect this item ? */ if( ( length =tvb_reported_length_remaining(tvb, *offset)) < item_len ) { + tvb_ensure_bytes_exist(tvb, *offset, item_len); proto_tree_add_text(pres_tree, tvb, *offset, item_len, "Wrong Item.Need %u bytes but have %u", item_len,length); break; @@ -1310,6 +1363,7 @@ show_sequence_top(ASN1_SCK *asn,proto_tree *pres_tree,tvbuff_t case USER_SESSION_REQUIREMENTS: + tvb_ensure_bytes_exist(tvb, *offset,(asn->offset-*offset)+ len1); itm = proto_tree_add_text(pres_tree, tvb, *offset,(asn->offset -*offset)+ len1, val_to_str(tag, sequence_top_vals,"Unknown item (0x%02x)")); @@ -1317,6 +1371,7 @@ show_sequence_top(ASN1_SCK *asn,proto_tree *pres_tree,tvbuff_t break; default: + tvb_ensure_bytes_exist(tvb, *offset,(asn->offset-*offset)+ len1); itm = proto_tree_add_text(pres_tree, tvb, *offset,(asn->offset -*offset)+ len1, "Unknown tag: %x",tag); @@ -1355,10 +1410,12 @@ show_connection_request_confirm(ASN1_SCK *asn,proto_tree *pres_tree,tvbuff_t if( ( length =tvb_reported_length_remaining(tvb, *offset)) < (guint)*item_len ) { + tvb_ensure_bytes_exist(tvb, *offset, -1); proto_tree_add_text(pres_tree, tvb, *offset, -1, "Wrong item.Need %u bytes but have %u", *item_len,length); return; } + tvb_ensure_bytes_exist(tvb, *offset-1, *item_len+(asn->offset-*offset)+1); ms = proto_tree_add_text(pres_tree, tvb, *offset-1, *item_len+(asn->offset-*offset)+1, val_to_str(asn1_tag, cr_vals, @@ -1368,8 +1425,10 @@ show_connection_request_confirm(ASN1_SCK *asn,proto_tree *pres_tree,tvbuff_t switch(asn1_tag) { case MODE_SELECTOR: + tvb_ensure_bytes_exist(tvb, (*offset)-1, 1); proto_tree_add_uint(pres_tree_ms, hf_pres_ms_type, tvb, (*offset)-1, 1, type); + tvb_ensure_bytes_exist(tvb, *offset, (asn->offset-*offset)); proto_tree_add_text(pres_tree_ms, tvb, *offset, (asn->offset-*offset), "Length:%u",*item_len); *offset=asn->offset; @@ -1377,14 +1436,17 @@ type); break; case SET_TOP: case SEQUENCE_TOP: + tvb_ensure_bytes_exist(tvb, (*offset)-1, 1); proto_tree_add_uint(pres_tree_ms, hf_pres_seq_type, tvb, (*offset)-1, 1, type); + tvb_ensure_bytes_exist(tvb, *offset, (asn->offset-*offset)); proto_tree_add_text(pres_tree_ms, tvb, *offset, (asn->offset-*offset), "Length:%u",*item_len); *offset=asn->offset; show_sequence_top(asn,pres_tree_ms,tvb,pinfo,offset,*item_len); break; default: + tvb_ensure_bytes_exist(tvb, (*offset)-1, *item_len+(asn->offset-*offset)+1); proto_tree_add_text(pres_tree, tvb, (*offset)-1, *item_len+(asn->offset-*offset)+1, "Unknown asn.1 parameter: (0x%02x).Tag :(0x%02x)", type,asn1_tag); @@ -1415,6 +1477,7 @@ dissect_ppdu(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree { if(tree) { + tvb_ensure_bytes_exist(tvb, offset, -1); proto_tree_add_text(tree, tvb, offset, -1, "Internal error:can't get spdu type from session dissector."); return FALSE; @@ -1427,6 +1490,7 @@ dissect_ppdu(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree { if(tree) { + tvb_ensure_bytes_exist(tvb, offset, -1); proto_tree_add_text(tree, tvb, offset, -1, "Internal error:wrong spdu type %x from session dissector.",session->spdu_type); return FALSE; @@ -1441,6 +1505,7 @@ dissect_ppdu(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree val_to_str(session->spdu_type, ses_vals, "Unknown Ppdu type (0x%02x)")); if (tree) { + tvb_ensure_bytes_exist(tvb, offset, -1); ti = proto_tree_add_item(tree, proto_pres, tvb, offset, -1, FALSE); pres_tree = proto_item_add_subtree(ti, ett_pres); @@ -1452,6 +1517,7 @@ dissect_ppdu(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree switch(session->spdu_type) { case SES_REFUSE: + tvb_ensure_bytes_exist(tvb, offset-1, 1); proto_tree_add_uint(pres_tree, hf_pres_type, tvb, offset-1, 1, s_type); if (read_length(&asn, pres_tree, hf_cp_type_message_length, &cp_type_len) != ASN1_ERR_NOERROR) @@ -1466,6 +1532,7 @@ dissect_ppdu(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree { if(tree) { + tvb_ensure_bytes_exist(tvb, offset, -1); proto_tree_add_text(pres_tree, tvb, offset, -1, "Wrong Ppdu.Need %u bytes but have %u", cp_type_len,length); } @@ -1479,6 +1546,7 @@ dissect_ppdu(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree break; case SES_CONNECTION_REQUEST: case SES_CONNECTION_ACCEPT: + tvb_ensure_bytes_exist(tvb, offset-1, 1); proto_tree_add_uint(pres_tree, hf_pres_type, tvb, offset-1, 1, s_type); if (read_length(&asn, pres_tree, hf_cp_type_message_length, &cp_type_len) @@ -1494,6 +1562,7 @@ dissect_ppdu(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree { if(tree) { + tvb_ensure_bytes_exist(tvb, offset, -1); proto_tree_add_text(pres_tree, tvb, offset, -1, "Wrong Ppdu.Need %u bytes but have %u", cp_type_len,length); } @@ -1516,6 +1585,7 @@ dissect_ppdu(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree { if(tree) { + tvb_ensure_bytes_exist(tvb, offset, -1); proto_tree_add_text(pres_tree, tvb, offset, -1, "Wrong Ppdu.Need %u bytes but have %u", rest_len,length); } @@ -1578,6 +1648,7 @@ dissect_ppdu(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree } } if( ((gint)rest_len) > 0) { + tvb_ensure_bytes_exist(tvb, offset, rest_len); ms = proto_tree_add_text(pres_tree, tvb, offset, rest_len, val_to_str(session->spdu_type, ses_vals, "Unknown Ppdu type (0x%02x)")); pres_tree_ms = proto_item_add_subtree(ms, ett_pres_ms); @@ -1624,6 +1695,7 @@ offset), offset = dissect_ppdu(tvb, offset, pinfo, tree); if(offset == FALSE ) { + tvb_ensure_bytes_exist(tvb, offset, -1); proto_tree_add_text(tree, tvb, offset, -1,"Internal error"); offset = tvb_length(tvb); break; |