aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-diameter.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2011-01-03 03:30:20 +0000
committerGuy Harris <guy@alum.mit.edu>2011-01-03 03:30:20 +0000
commitcff9f14959116493fbf9b33a630462a6c0c01053 (patch)
treee2cda3f8256b9649e08e64e63d2306e615c0b816 /epan/dissectors/packet-diameter.c
parentd049046268d00930ccf08cddc6dadaa16648a4ec (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.c143
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 }
};