aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-pres.c
diff options
context:
space:
mode:
authorGerald Combs <gerald@wireshark.org>2005-04-26 22:06:04 +0000
committerGerald Combs <gerald@wireshark.org>2005-04-26 22:06:04 +0000
commit310c8a84347d85542e8f2bfa0344a17b800246a3 (patch)
tree64b1019d73e415ea7abc7a9247962df4b04ec8b8 /epan/dissectors/packet-pres.c
parente1a597eccfa22db82e39d45278f7e29967239041 (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/packet-pres.c')
-rw-r--r--epan/dissectors/packet-pres.c78
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;