diff options
author | Gerald Combs <gerald@wireshark.org> | 2005-04-17 05:11:25 +0000 |
---|---|---|
committer | Gerald Combs <gerald@wireshark.org> | 2005-04-17 05:11:25 +0000 |
commit | efd08d91bc854188407ae2da13cd9b85edbb2e54 (patch) | |
tree | 298c0a8779eadbdbd9ca4d12f602940318d63c70 /epan/dissectors/packet-wsp.c | |
parent | 67a2c952a676782641b27eb4a11bb0f3d4973dfe (diff) |
Add even more calls to tvb_ensure_bytes_exist().
svn path=/trunk/; revision=14111
Diffstat (limited to 'epan/dissectors/packet-wsp.c')
-rw-r--r-- | epan/dissectors/packet-wsp.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/epan/dissectors/packet-wsp.c b/epan/dissectors/packet-wsp.c index 5f68dbab6f..b0ef58246e 100644 --- a/epan/dissectors/packet-wsp.c +++ b/epan/dissectors/packet-wsp.c @@ -1794,6 +1794,7 @@ add_headers (proto_tree *tree, tvbuff_t *tvb, int hf, packet_info *pinfo) if (val_id >= 0x20 && val_id <=0x7E) { /* OK! */ val_str = (gchar *)tvb_get_stringz(tvb, val_start, (gint *)&val_len); offset = val_start + val_len; + tvb_ensure_bytes_exist(tvb, hdr_start, offset-hdr_start); proto_tree_add_text(wsp_headers,tvb,hdr_start,offset-hdr_start, "%s: %s", hdr_str, val_str); g_free (val_str); @@ -1832,6 +1833,7 @@ add_headers (proto_tree *tree, tvbuff_t *tvb, int hf, packet_info *pinfo) } offset = tvb_len; } + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); proto_tree_add_string_hidden(wsp_headers, hf_hdr_name, tvb, hdr_start, offset - hdr_start, hdr_str); } else if (hdr_id > 0) { /* Shorthand HCP switch */ @@ -1974,16 +1976,19 @@ wkh_default(proto_tree *tree, tvbuff_t *tvb, ok = TRUE; /* Bypass error checking as we don't parse the values! */ wkh_1_WellKnownValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_text (tree, tvb, hdr_start, offset - hdr_start, "%s: (Undecoded well-known value 0x%02x)", val_to_str (hdr_id, vals_field_names, "<Unknown WSP header field 0x%02X>"), val_id & 0x7F); wkh_2_TextualValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_text(tree, tvb, hdr_start, offset - hdr_start, "%s: %s", val_to_str (hdr_id, vals_field_names, "<Unknown WSP header field 0x%02X>"), val_str); wkh_3_ValueWithLength; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_text (tree, tvb, hdr_start, offset - hdr_start, "%s: (Undecoded value in general form with length indicator)", val_to_str (hdr_id, vals_field_names, @@ -2119,6 +2124,7 @@ add_content_type(proto_tree *tree, tvbuff_t *tvb, guint32 val_start, DebugLog(("add_content_type() - Well-known - Start\n")); *textual_content = val_to_str(val_id & 0x7F, vals_content_types, "<Unknown media type identifier 0x%X>"); + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_content_type, tvb, hdr_start, offset - hdr_start, *textual_content); @@ -2130,6 +2136,7 @@ add_content_type(proto_tree *tree, tvbuff_t *tvb, guint32 val_start, /* Sometimes with a No-Content response, a NULL content type * is reported. Process this correctly! */ if (*val_str) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_content_type, tvb, hdr_start, offset - hdr_start, val_str); @@ -2137,6 +2144,7 @@ add_content_type(proto_tree *tree, tvbuff_t *tvb, guint32 val_start, *textual_content = g_strdup(val_str); *well_known_content = 0; } else { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_content_type, tvb, hdr_start, offset - hdr_start, "<no media type has been specified>"); @@ -2155,6 +2163,7 @@ add_content_type(proto_tree *tree, tvbuff_t *tvb, guint32 val_start, /* As we're using val_str, it is automatically g_free()d */ /* ??? Not sure anymore, we're in wkh_3, not in wkh_2 ! */ off += len; /* off now points to 1st byte after string */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string (tree, hf_hdr_content_type, tvb, hdr_start, offset - hdr_start, val_str); /* Following statement: required? */ @@ -2166,6 +2175,7 @@ add_content_type(proto_tree *tree, tvbuff_t *tvb, guint32 val_start, if (ok) { *textual_content = val_to_str(val, vals_content_types, "<Unknown media type identifier 0x%X>"); + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_content_type, tvb, hdr_start, offset - hdr_start, *textual_content); @@ -2273,6 +2283,7 @@ wkh_push_flag(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *p proto_tree *subtree = NULL; wkh_1_WellKnownValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_push_flag, tvb, hdr_start, offset - hdr_start, ""); subtree = proto_item_add_subtree(ti, ett_header); @@ -2318,6 +2329,7 @@ static guint32 wkh_profile_diff_wbxml (proto_tree *tree, tvbuff_t *tvb, wkh_2_TextualValue; /* Invalid */ wkh_3_ValueWithLength; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_profile_diff, tvb, hdr_start, offset - hdr_start, "(Profile-Diff value as WBXML)"); subtree = proto_item_add_subtree(ti, ett_header); @@ -2340,6 +2352,7 @@ wkh_allow(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo wkh_1_WellKnownValue; val_id &= 0x7F; if (val_id >= 0x40) { /* Valid WSP method */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_allow, tvb, hdr_start, offset - hdr_start, val_to_str(val_id & 0x7F, vals_pdu_type, @@ -2366,6 +2379,7 @@ wkh_public(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinf wkh_1_WellKnownValue; val_id &= 0x7F; if (val_id >= 0x40) { /* Valid WSP method */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_public, tvb, hdr_start, offset - hdr_start, val_to_str(val_id & 0x7F, vals_pdu_type, @@ -2373,6 +2387,7 @@ wkh_public(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinf ok = TRUE; } wkh_2_TextualValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_public, tvb, hdr_start, offset - hdr_start, val_str); ok = TRUE; @@ -2392,12 +2407,14 @@ wkh_vary(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo wkh_0_Declarations; wkh_1_WellKnownValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_vary, tvb, hdr_start, offset - hdr_start, val_to_str(val_id & 0x7F, vals_field_names, "<Unknown WSP header field 0x%02X>")); ok = TRUE; wkh_2_TextualValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_vary, tvb, hdr_start, offset - hdr_start, val_str); @@ -2418,6 +2435,7 @@ wkh_x_wap_security(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_in wkh_1_WellKnownValue; if (val_id == 0x80) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_x_wap_security, tvb, hdr_start, offset - hdr_start, "close-subordinate"); ok = TRUE; @@ -2440,11 +2458,13 @@ wkh_connection(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info * wkh_1_WellKnownValue; if (val_id == 0x80) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_connection, tvb, hdr_start, offset - hdr_start, "close"); ok = TRUE; } wkh_2_TextualValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_connection, tvb, hdr_start, offset - hdr_start, val_str); ok = TRUE; @@ -2464,11 +2484,13 @@ wkh_transfer_encoding(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet wkh_1_WellKnownValue; if (val_id == 0x80) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_transfer_encoding, tvb, hdr_start, offset - hdr_start, "chunked"); ok = TRUE; } wkh_2_TextualValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_transfer_encoding, tvb, hdr_start, offset - hdr_start, val_str); ok = TRUE; @@ -2489,17 +2511,20 @@ wkh_accept_ranges(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_inf wkh_1_WellKnownValue; switch (val_id) { case 0x80: /* none */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_accept_ranges, tvb, hdr_start, offset - hdr_start, "none"); ok = TRUE; break; case 0x81: /* bytes */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_accept_ranges, tvb, hdr_start, offset - hdr_start, "bytes"); ok = TRUE; break; } wkh_2_TextualValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_accept_ranges, tvb, hdr_start, offset - hdr_start, val_str); ok = TRUE; @@ -2520,22 +2545,26 @@ wkh_content_encoding(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_ wkh_1_WellKnownValue; switch (val_id) { case 0x80: /* gzip */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_content_encoding, tvb, hdr_start, offset - hdr_start, "gzip"); ok = TRUE; break; case 0x81: /* compress */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_content_encoding, tvb, hdr_start, offset - hdr_start, "compress"); ok = TRUE; break; case 0x82: /* deflate */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_content_encoding, tvb, hdr_start, offset - hdr_start, "deflate"); ok = TRUE; break; } wkh_2_TextualValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_content_encoding, tvb, hdr_start, offset - hdr_start, val_str); ok = TRUE; @@ -2563,22 +2592,26 @@ wkh_accept_encoding(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_i wkh_1_WellKnownValue; switch (val_id) { case 0x80: /* gzip */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_accept_encoding, tvb, hdr_start, offset - hdr_start, "gzip"); ok = TRUE; break; case 0x81: /* compress */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_accept_encoding, tvb, hdr_start, offset - hdr_start, "compress"); ok = TRUE; break; case 0x82: /* deflate */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_accept_encoding, tvb, hdr_start, offset - hdr_start, "deflate"); ok = TRUE; break; } wkh_2_TextualValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); proto_tree_add_string(tree, hf_hdr_accept_encoding, tvb, hdr_start, offset - hdr_start, val_str); ok = TRUE; @@ -2588,21 +2621,25 @@ wkh_accept_encoding(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_i if (is_short_integer(peek)) { switch (val_id) { case 0x80: /* gzip */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_accept_encoding, tvb, hdr_start, offset - hdr_start, "gzip"); ok = TRUE; break; case 0x81: /* compress */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_accept_encoding, tvb, hdr_start, offset - hdr_start, "compress"); ok = TRUE; break; case 0x82: /* deflate */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_accept_encoding, tvb, hdr_start, offset - hdr_start, "deflate"); ok = TRUE; break; case 0x83: /* any */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_accept_encoding, tvb, hdr_start, offset - hdr_start, "*"); ok = TRUE; @@ -2612,6 +2649,7 @@ wkh_accept_encoding(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_i } else { get_token_text(str, tvb, off, len, ok); if (ok) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_accept_encoding, tvb, hdr_start, offset - hdr_start, str); g_free(str); @@ -2657,16 +2695,19 @@ wkh_content_disposition(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, pack if (is_short_integer(peek)) { switch (peek) { case 0x80: /* form-data */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_content_disposition, tvb, hdr_start, offset - hdr_start, "form-data"); ok = TRUE; break; case 0x81: /* attachment */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_content_disposition, tvb, hdr_start, offset - hdr_start, "attachment"); ok = TRUE; break; case 0x82: /* inline */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_content_disposition, tvb, hdr_start, offset - hdr_start, "inline"); ok = TRUE; @@ -2676,6 +2717,7 @@ wkh_content_disposition(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, pack } else { get_token_text(str, tvb, off, len, ok); if (ok) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_content_disposition, tvb, hdr_start, offset - hdr_start, str); g_free(str); @@ -2920,6 +2962,7 @@ wkh_age(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _ wkh_1_WellKnownValue; val = val_id & 0x7F; val_str = g_strdup_printf("%u second%s", val, plurality(val, "", "s")); + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_age, tvb, hdr_start, offset - hdr_start, val_str); g_free(val_str); /* proto_XXX creates a copy */ @@ -2931,6 +2974,7 @@ wkh_age(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _ get_long_integer(val, tvb, off, len, ok); if (ok) { val_str = g_strdup_printf("%u second%s", val, plurality(val, "", "s")); + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_age, tvb, hdr_start, offset - hdr_start, val_str); g_free(val_str); /* proto_XXX creates a copy */ @@ -3194,6 +3238,7 @@ wkh_content_md5 (proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info tvb_get_guint8(tvb, off + 14), tvb_get_guint8(tvb, off + 15) ); + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_content_md5, tvb, hdr_start, offset - hdr_start, val_str); g_free(val_str); @@ -3214,6 +3259,7 @@ wkh_pragma(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinf wkh_1_WellKnownValue; if (val_id == 0x80) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_pragma, tvb, hdr_start, offset - hdr_start, "no-cache"); ok = TRUE; @@ -3222,6 +3268,7 @@ wkh_pragma(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinf /* Invalid */ wkh_3_ValueWithLength; off = val_start + val_len_len; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_pragma, tvb, hdr_start, off - hdr_start, ""); /* NULL subtree for parameter() results in no subtree @@ -3333,11 +3380,13 @@ wkh_cache_control(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_inf val = val_id & 0x7F; val_str = match_strval(val, vals_cache_control); if (val_str) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_cache_control, tvb, hdr_start, offset - hdr_start, val_str); ok = TRUE; } wkh_2_TextualValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_cache_control, tvb, hdr_start, offset - hdr_start, val_str); ok = TRUE; @@ -3355,6 +3404,7 @@ wkh_cache_control(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_inf switch (cache_control_directive & 0x7F) { case CACHE_CONTROL_NO_CACHE: case CACHE_CONTROL_PRIVATE: + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_cache_control, tvb, hdr_start, offset - hdr_start, val_to_str (cache_control_directive & 0x7F, vals_cache_control, @@ -3383,6 +3433,7 @@ wkh_cache_control(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_inf case CACHE_CONTROL_MAX_STALE: case CACHE_CONTROL_MIN_FRESH: case CACHE_CONTROL_S_MAXAGE: + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_cache_control, tvb, hdr_start, offset - hdr_start, val_to_str (cache_control_directive & 0x7F, vals_cache_control, @@ -3403,6 +3454,7 @@ wkh_cache_control(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_inf } else if (is_token_text(cache_control_directive)) { get_token_text(val_str, tvb, off, len, ok); if (ok) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_cache_control, tvb, hdr_start, offset - hdr_start, val_str); g_free(val_str); @@ -3457,6 +3509,7 @@ wkh_warning(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pin val = val_id & 0x7F; val_str = match_strval(val, vals_wsp_warning_code); if (val_str) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_warning, tvb, hdr_start, offset - hdr_start, val_str); subtree = proto_item_add_subtree(ti, ett_header); @@ -3475,6 +3528,7 @@ wkh_warning(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pin val_str = match_strval(val, vals_wsp_warning_code_short); if (val_str) { /* OK */ str = g_strdup_printf("code=%s", val_str); + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_warning, tvb, hdr_start, offset - hdr_start, str); g_free(str); @@ -3527,6 +3581,7 @@ wkh_profile_warning(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_i val = val_id & 0x7F; val_str = match_strval(val, vals_wsp_profile_warning_code); if (val_str) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_profile_warning, tvb, hdr_start, offset - hdr_start, val_str); ok = TRUE; @@ -3539,6 +3594,7 @@ wkh_profile_warning(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_i if (warn_code & 0x80) { /* Well known warn code */ val_str = match_strval(val, vals_wsp_profile_warning_code); if (val_str) { /* OK */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_profile_warning, tvb, hdr_start, offset - hdr_start, val_str); get_uri_value(str, tvb, off, len, ok); @@ -3586,11 +3642,13 @@ static guint32 wkh_encoding_version (proto_tree *tree, tvbuff_t *tvb, wkh_1_WellKnownValue; val = val_id & 0x7F; val_str = g_strdup_printf("%u.%u", val >> 4, val & 0x0F); + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); proto_tree_add_string(tree, hf_hdr_encoding_version, tvb, hdr_start, offset - hdr_start, val_str); g_free(val_str); ok = TRUE; wkh_2_TextualValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); proto_tree_add_string(tree, hf_hdr_encoding_version, tvb, hdr_start, offset - hdr_start, val_str); ok = TRUE; @@ -3599,6 +3657,7 @@ static guint32 wkh_encoding_version (proto_tree *tree, tvbuff_t *tvb, val = tvb_get_guint8(tvb, off); if (val & 0x80) { /* Header Code Page */ val_str = g_strdup_printf("code-page=%u", val & 0x7F); + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_encoding_version, tvb, hdr_start, offset - hdr_start, val_str); g_free(val_str); @@ -3638,6 +3697,7 @@ wkh_content_range(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_inf get_uintvar_integer (val, tvb, off, len, ok); /* Uintvar start */ if (ok) { val_str = g_strdup_printf("first-byte-pos=%u", val); + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_content_range, tvb, hdr_start, offset - hdr_start, val_str); subtree = proto_item_add_subtree(ti, ett_header); @@ -3686,6 +3746,7 @@ wkh_range(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo off = val_start + val_len_len; val = tvb_get_guint8(tvb, off); if (val == 0x80) { /* Byte-range */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_range, tvb, hdr_start, offset - hdr_start, "byte-range"); subtree = proto_item_add_subtree(ti, ett_header); @@ -3712,6 +3773,7 @@ wkh_range(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo } } } else if (val == 0x81) { /* Suffix-byte-range */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_range, tvb, hdr_start, offset - hdr_start, "suffix-byte-range"); subtree = proto_item_add_subtree(ti, ett_header); @@ -3741,6 +3803,7 @@ static guint32 wkh_te (proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packe wkh_1_WellKnownValue; if (val_id == 0x81) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); proto_tree_add_string(tree, hf_hdr_encoding_version, tvb, hdr_start, offset - hdr_start, "trailers"); ok = TRUE; @@ -3753,6 +3816,7 @@ static guint32 wkh_te (proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packe if (val & 0x80) { /* Well-known-TE */ val_str = match_strval((val & 0x7F), vals_well_known_te); if (val_str) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_te, tvb, hdr_start, off - hdr_start, val_str); off++; @@ -3761,6 +3825,7 @@ static guint32 wkh_te (proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packe } else { /* TE in Token-text format */ get_token_text(val_str, tvb, off, len, ok); if (ok) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_string(tree, hf_hdr_te, tvb, hdr_start, off - hdr_start, val_str); g_free(val_str); @@ -3788,6 +3853,7 @@ static guint32 wkh_te (proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packe */ #undef wkh_1_WellKnownValue #define wkh_1_WellKnownValue /* Parse Well Known Value */ \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ proto_tree_add_string_hidden(tree, hf_hdr_name, \ tvb, hdr_start, offset - hdr_start, \ val_to_str (hdr_id, vals_openwave_field_names, \ @@ -3836,16 +3902,19 @@ wkh_openwave_default(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_ ok = TRUE; /* Bypass error checking as we don't parse the values! */ wkh_1_WellKnownValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_text(tree, tvb, hdr_start, offset - hdr_start, "%s: (Undecoded well-known value 0x%02x)", val_to_str (hdr_id, vals_openwave_field_names, "<Unknown WSP header field 0x%02X>"), val_id & 0x7F); wkh_2_TextualValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_text(tree,tvb,hdr_start, offset - hdr_start, "%s: %s", val_to_str (hdr_id, vals_openwave_field_names, "<Unknown WSP header field 0x%02X>"), val_str); wkh_3_ValueWithLength; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); ti = proto_tree_add_text(tree, tvb, hdr_start, offset - hdr_start, "%s: (Undecoded value in general form with length indicator)", val_to_str (hdr_id, vals_openwave_field_names, @@ -4032,10 +4101,12 @@ parameter (proto_tree *tree, proto_item *ti, tvbuff_t *tvb, int start, int len) if (is_quoted_string(val_str[0])) { /* Add trailing quote! */ if (is_quoted_string(val_str[val_len-2])) { /* Trailing quote - issue a warning */ + tvb_ensure_bytes_exist(tvb, start, offset - start); proto_tree_add_text(tree, tvb, start, offset - start, "%s: %s" TrailingQuoteWarning, str, val_str); s = g_strdup_printf("; %s=%s", str, val_str); } else { /* OK (no trailing quote) */ + tvb_ensure_bytes_exist(tvb, start, offset - start); proto_tree_add_text(tree, tvb, start, offset - start, "%s: %s\"", str, val_str); s = g_strdup_printf("; %s=%s\"", str, val_str); @@ -4043,6 +4114,7 @@ parameter (proto_tree *tree, proto_item *ti, tvbuff_t *tvb, int start, int len) } else { /* Token-text | 0x00 */ /* TODO - verify that it is either Token-text or 0x00 * and flag with warning if invalid */ + tvb_ensure_bytes_exist(tvb, start, offset - start); proto_tree_add_text(tree, tvb, start, offset - start, "%s: %s", str, val_str); s = g_strdup_printf("; %s=%s", str, val_str); @@ -4061,6 +4133,7 @@ parameter (proto_tree *tree, proto_item *ti, tvbuff_t *tvb, int start, int len) get_integer_value (val,tvb,offset,val_len,ok); if (ok) { /* Also found a valid integer parameter value: val */ offset += val_len; + tvb_ensure_bytes_exist(tvb, start, offset - start); proto_tree_add_text(tree, tvb, start, offset - start, "%s: %u", str, val); s = g_strdup_printf("; %s=%u", str, val); @@ -4071,6 +4144,7 @@ parameter (proto_tree *tree, proto_item *ti, tvbuff_t *tvb, int start, int len) * protocol tree for the untyped parameter case */ } else { /* Error: neither token-text not Integer-value */ DebugLog(("Invalid untyped parameter value!\n")); + tvb_ensure_bytes_exist(tvb, start, offset - start); proto_tree_add_text (tree, tvb, start, offset - start, "<Error: Invalid untyped parameter definition>"); offset = start + len; /* Skip to end of buffer */ @@ -4087,6 +4161,7 @@ parameter (proto_tree *tree, proto_item *ti, tvbuff_t *tvb, int start, int len) DebugLog(("parameter() - Typed - Start\n")); get_integer_value (type,tvb,start,type_len,ok); if (!ok) { + tvb_ensure_bytes_exist(tvb, start, offset - start); proto_tree_add_text (tree, tvb, start, offset - start, "<Error: Invalid typed parameter definition>"); return (start + len); /* Skip to end of buffer */ @@ -4165,6 +4240,7 @@ parameter (proto_tree *tree, proto_item *ti, tvbuff_t *tvb, int start, int len) } /* Else: invalid parameter value */ } if (ok) { + tvb_ensure_bytes_exist(tvb, start, offset - start); proto_tree_add_string (tree, hf_wsp_parameter_upart_type, tvb, start, offset - start, val_str); str = g_strdup_printf("; type=%s", val_str); @@ -4288,48 +4364,56 @@ parameter (proto_tree *tree, proto_item *ti, tvbuff_t *tvb, int start, int len) case 0x07: /* WSP 1.1 encoding - Differences: Field-name */ DebugLog(("Skipping remaining parameters from here\n")); + tvb_ensure_bytes_exist(tvb, start, offset - start); proto_tree_add_text(tree, tvb, start, offset - start, "Undecoded parameter Differences - decoding stopped"); break; case 0x08: /* WSP 1.1 encoding - Padding: Short-integer */ DebugLog(("Skipping remaining parameters from here\n")); + tvb_ensure_bytes_exist(tvb, start, offset - start); proto_tree_add_text(tree, tvb, start, offset - start, "Undecoded parameter Padding - decoding stopped"); break; case 0x0E: /* WSP 1.3 encoding - Max-Age: Delta-seconds-value */ DebugLog(("Skipping remaining parameters from here\n")); + tvb_ensure_bytes_exist(tvb, start, offset - start); proto_tree_add_text(tree, tvb, start, offset - start, "Undecoded parameter Max-Age - decoding stopped"); break; case 0x10: /* WSP 1.3 encoding - Secure: No-value */ DebugLog(("Skipping remaining parameters from here\n")); + tvb_ensure_bytes_exist(tvb, start, offset - start); proto_tree_add_text(tree, tvb, start, offset - start, "Undecoded parameter Secure - decoding stopped"); break; case 0x13: /* WSP 1.4 encoding - Creation-date: Date-value */ DebugLog(("Skipping remaining parameters from here\n")); + tvb_ensure_bytes_exist(tvb, start, offset - start); proto_tree_add_text(tree, tvb, start, offset - start, "Undecoded parameter Creation-Date - decoding stopped"); break; case 0x14: /* WSP 1.4 encoding - Modification-date: Date-value */ DebugLog(("Skipping remaining parameters from here\n")); + tvb_ensure_bytes_exist(tvb, start, offset - start); proto_tree_add_text(tree, tvb, start, offset - start, "Undecoded parameter Modification-Date - decoding stopped"); break; case 0x15: /* WSP 1.4 encoding - Read-date: Date-value */ DebugLog(("Skipping remaining parameters from here\n")); + tvb_ensure_bytes_exist(tvb, start, offset - start); proto_tree_add_text(tree, tvb, start, offset - start, "Undecoded parameter Read-Date - decoding stopped"); break; default: DebugLog(("Skipping remaining parameters from here\n")); + tvb_ensure_bytes_exist(tvb, start, offset - start); proto_tree_add_text(tree, tvb, start, offset - start, "Undecoded parameter type 0x%02x - decoding stopped", type); @@ -5875,6 +5959,7 @@ add_multipart_data (proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo) DataLen = tvb_get_guintvar (tvb, offset, &count); offset += count; if (tree) { + tvb_ensure_bytes_exist(tvb, part_start, HeadersLen + DataLen + (offset - part_start)); ti = proto_tree_add_uint(sub_tree, hf_wsp_mpart, tvb, part_start, HeadersLen + DataLen + (offset - part_start), partnr); mpart_tree = proto_item_add_subtree(ti, ett_multiparts); |