diff options
author | Guy Harris <guy@alum.mit.edu> | 2011-01-03 03:30:20 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2011-01-03 03:30:20 +0000 |
commit | cff9f14959116493fbf9b33a630462a6c0c01053 (patch) | |
tree | e2cda3f8256b9649e08e64e63d2306e615c0b816 /epan/dissectors/packet-diameter.c | |
parent | d049046268d00930ccf08cddc6dadaa16648a4ec (diff) |
Do length checking for Integer32, Integer64, Unsigned64, Float32, and
Float64, as well as for Unsigned32.
svn path=/trunk/; revision=35332
Diffstat (limited to 'epan/dissectors/packet-diameter.c')
-rw-r--r-- | epan/dissectors/packet-diameter.c | 143 |
1 files changed, 134 insertions, 9 deletions
diff --git a/epan/dissectors/packet-diameter.c b/epan/dissectors/packet-diameter.c index b4412f5c26..fa1e6e7039 100644 --- a/epan/dissectors/packet-diameter.c +++ b/epan/dissectors/packet-diameter.c @@ -617,7 +617,7 @@ simple_avp(diam_ctx_t* c, diam_avp_t* a, tvbuff_t* tvb) } static const char* -unsigned32_avp(diam_ctx_t* c, diam_avp_t* a, tvbuff_t* tvb) +integer32_avp(diam_ctx_t* c, diam_avp_t* a, tvbuff_t* tvb) { char* label = ep_alloc(ITEM_LABEL_LENGTH+1); proto_item* pi; @@ -642,6 +642,131 @@ unsigned32_avp(diam_ctx_t* c, diam_avp_t* a, tvbuff_t* tvb) } static const char* +integer64_avp(diam_ctx_t* c, diam_avp_t* a, tvbuff_t* tvb) +{ + char* label = ep_alloc(ITEM_LABEL_LENGTH+1); + proto_item* pi; + + /* Verify length before adding */ + gint length = tvb_length_remaining(tvb,0); + if (length == 8) { + pi= proto_tree_add_item(c->tree,a->hf_value,tvb,0,tvb_length_remaining(tvb,0),FALSE); + proto_item_fill_label(PITEM_FINFO(pi), label); + label = strstr(label,": ")+2; + } + else { + pi = proto_tree_add_bytes_format(c->tree, hf_diameter_avp_data_wrong_length, + tvb, 0, length, + tvb_get_ptr(tvb, 0, length), + "Error! Bad Integer64 Length"); + expert_add_info_format(c->pinfo, pi, PI_MALFORMED, PI_NOTE, + "Bad Integer64 Length (%u)", length); + PROTO_ITEM_SET_GENERATED(pi); + } + return label; +} + +static const char* +unsigned32_avp(diam_ctx_t* c, diam_avp_t* a, tvbuff_t* tvb) +{ + char* label = ep_alloc(ITEM_LABEL_LENGTH+1); + proto_item* pi; + + /* Verify length before adding */ + gint length = tvb_length_remaining(tvb,0); + if (length == 4) { + pi= proto_tree_add_item(c->tree,a->hf_value,tvb,0,tvb_length_remaining(tvb,0),FALSE); + proto_item_fill_label(PITEM_FINFO(pi), label); + label = strstr(label,": ")+2; + } + else { + pi = proto_tree_add_bytes_format(c->tree, hf_diameter_avp_data_wrong_length, + tvb, 0, length, + tvb_get_ptr(tvb, 0, length), + "Error! Bad Unsigned32 Length"); + expert_add_info_format(c->pinfo, pi, PI_MALFORMED, PI_NOTE, + "Bad Unsigned32 Length (%u)", length); + PROTO_ITEM_SET_GENERATED(pi); + } + return label; +} + +static const char* +unsigned64_avp(diam_ctx_t* c, diam_avp_t* a, tvbuff_t* tvb) +{ + char* label = ep_alloc(ITEM_LABEL_LENGTH+1); + proto_item* pi; + + /* Verify length before adding */ + gint length = tvb_length_remaining(tvb,0); + if (length == 8) { + pi= proto_tree_add_item(c->tree,a->hf_value,tvb,0,tvb_length_remaining(tvb,0),FALSE); + proto_item_fill_label(PITEM_FINFO(pi), label); + label = strstr(label,": ")+2; + } + else { + pi = proto_tree_add_bytes_format(c->tree, hf_diameter_avp_data_wrong_length, + tvb, 0, length, + tvb_get_ptr(tvb, 0, length), + "Error! Bad Unsigned64 Length"); + expert_add_info_format(c->pinfo, pi, PI_MALFORMED, PI_NOTE, + "Bad Unsigned64 Length (%u)", length); + PROTO_ITEM_SET_GENERATED(pi); + } + return label; +} + +static const char* +float32_avp(diam_ctx_t* c, diam_avp_t* a, tvbuff_t* tvb) +{ + char* label = ep_alloc(ITEM_LABEL_LENGTH+1); + proto_item* pi; + + /* Verify length before adding */ + gint length = tvb_length_remaining(tvb,0); + if (length == 4) { + pi= proto_tree_add_item(c->tree,a->hf_value,tvb,0,tvb_length_remaining(tvb,0),FALSE); + proto_item_fill_label(PITEM_FINFO(pi), label); + label = strstr(label,": ")+2; + } + else { + pi = proto_tree_add_bytes_format(c->tree, hf_diameter_avp_data_wrong_length, + tvb, 0, length, + tvb_get_ptr(tvb, 0, length), + "Error! Bad Float32 Length"); + expert_add_info_format(c->pinfo, pi, PI_MALFORMED, PI_NOTE, + "Bad Float32 Length (%u)", length); + PROTO_ITEM_SET_GENERATED(pi); + } + return label; +} + +static const char* +float64_avp(diam_ctx_t* c, diam_avp_t* a, tvbuff_t* tvb) +{ + char* label = ep_alloc(ITEM_LABEL_LENGTH+1); + proto_item* pi; + + /* Verify length before adding */ + gint length = tvb_length_remaining(tvb,0); + if (length == 8) { + pi= proto_tree_add_item(c->tree,a->hf_value,tvb,0,tvb_length_remaining(tvb,0),FALSE); + proto_item_fill_label(PITEM_FINFO(pi), label); + label = strstr(label,": ")+2; + } + else { + pi = proto_tree_add_bytes_format(c->tree, hf_diameter_avp_data_wrong_length, + tvb, 0, length, + tvb_get_ptr(tvb, 0, length), + "Error! Bad Float64 Length"); + expert_add_info_format(c->pinfo, pi, PI_MALFORMED, PI_NOTE, + "Bad Float64 Length (%u)", length); + PROTO_ITEM_SET_GENERATED(pi); + } + return label; +} + +static const char* grouped_avp(diam_ctx_t* c, diam_avp_t* a, tvbuff_t* tvb) { int offset = 0; @@ -1159,19 +1284,19 @@ build_simple_avp(const avp_type_t* type, guint32 code, const diam_vnd_t* vendor, static const avp_type_t basic_types[] = { {"octetstring" , simple_avp , simple_avp , FT_BYTES , BASE_NONE , build_simple_avp }, {"utf8string" , simple_avp , simple_avp , FT_STRING , BASE_NONE , build_simple_avp }, - {"grouped" , grouped_avp , grouped_avp , FT_BYTES , BASE_NONE , build_simple_avp }, - {"integer32" , simple_avp , simple_avp , FT_INT32 , BASE_DEC , build_simple_avp }, + {"grouped" , grouped_avp , grouped_avp , FT_BYTES , BASE_NONE , build_simple_avp }, + {"integer32" , integer32_avp , integer32_avp , FT_INT32 , BASE_DEC , build_simple_avp }, {"unsigned32" , unsigned32_avp, unsigned32_avp, FT_UINT32 , BASE_DEC , build_simple_avp }, - {"integer64" , simple_avp , simple_avp , FT_INT64 , BASE_DEC , build_simple_avp }, - {"unsigned64" , simple_avp , simple_avp , FT_UINT64 , BASE_DEC , build_simple_avp }, - {"float32" , simple_avp , simple_avp , FT_FLOAT , BASE_NONE , build_simple_avp }, - {"float64" , simple_avp , simple_avp , FT_DOUBLE , BASE_NONE , build_simple_avp }, - {"ipaddress" , NULL , NULL , FT_NONE , BASE_NONE , build_address_avp }, + {"integer64" , integer64_avp , integer64_avp , FT_INT64 , BASE_DEC , build_simple_avp }, + {"unsigned64" , unsigned64_avp, unsigned64_avp , FT_UINT64 , BASE_DEC , build_simple_avp }, + {"float32" , float32_avp , float32_avp , FT_FLOAT , BASE_NONE , build_simple_avp }, + {"float64" , float64_avp , float64_avp , FT_DOUBLE , BASE_NONE , build_simple_avp }, + {"ipaddress" , NULL , NULL , FT_NONE , BASE_NONE , build_address_avp }, {"diameteruri" , simple_avp , simple_avp , FT_STRING , BASE_NONE , build_simple_avp }, {"diameteridentity" , simple_avp , simple_avp , FT_STRING , BASE_NONE , build_simple_avp }, {"ipfilterrule" , simple_avp , simple_avp , FT_STRING , BASE_NONE , build_simple_avp }, {"qosfilterrule" , simple_avp , simple_avp , FT_STRING , BASE_NONE , build_simple_avp }, - {"time" , time_avp , time_avp , FT_UINT32 , BASE_DEC , build_simple_avp }, + {"time" , time_avp , time_avp , FT_UINT32 , BASE_DEC , build_simple_avp }, {NULL, NULL, NULL, FT_NONE, BASE_NONE, NULL } }; |