diff options
author | Michael Mann <mmann78@netscape.net> | 2016-05-02 21:44:48 -0400 |
---|---|---|
committer | Michael Mann <mmann78@netscape.net> | 2016-05-05 19:27:55 +0000 |
commit | 5493fe01671f7f293eb87edb780019c889859153 (patch) | |
tree | b9e693b03d0c99c974ceb2255965b8fe1ecef879 /epan/ftypes | |
parent | ec382e89cb71be1bbd67854799de887d3e9746fe (diff) |
Convert ftype-tvbuff.c to ftype-protocol.c
As noted in https://www.wireshark.org/lists/wireshark-dev/201604/msg00103.html
a protocol field isn't really a tv_buff, so allow for the possibility
of a NULL tv_buff in a "protocol type". If the tvb is NULL, use the
string of the protocol field for comparison
Bug: 12335
Change-Id: Ie12a5f7b31c7293c61006b0f70135d100a97c4e0
Reviewed-on: https://code.wireshark.org/review/15261
Petri-Dish: Michael Mann <mmann78@netscape.net>
Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'epan/ftypes')
-rw-r--r-- | epan/ftypes/.editorconfig | 2 | ||||
-rw-r--r-- | epan/ftypes/CMakeLists.txt | 2 | ||||
-rw-r--r-- | epan/ftypes/Makefile.common | 4 | ||||
-rw-r--r-- | epan/ftypes/ftype-bytes.c | 18 | ||||
-rw-r--r-- | epan/ftypes/ftype-double.c | 4 | ||||
-rw-r--r-- | epan/ftypes/ftype-guid.c | 2 | ||||
-rw-r--r-- | epan/ftypes/ftype-ieee-11073-float.c | 4 | ||||
-rw-r--r-- | epan/ftypes/ftype-integer.c | 40 | ||||
-rw-r--r-- | epan/ftypes/ftype-ipv4.c | 2 | ||||
-rw-r--r-- | epan/ftypes/ftype-ipv6.c | 2 | ||||
-rw-r--r-- | epan/ftypes/ftype-none.c | 2 | ||||
-rw-r--r-- | epan/ftypes/ftype-pcre.c | 2 | ||||
-rw-r--r-- | epan/ftypes/ftype-protocol.c (renamed from epan/ftypes/ftype-tvbuff.c) | 192 | ||||
-rw-r--r-- | epan/ftypes/ftype-string.c | 8 | ||||
-rw-r--r-- | epan/ftypes/ftype-time.c | 4 | ||||
-rw-r--r-- | epan/ftypes/ftypes-int.h | 4 | ||||
-rw-r--r-- | epan/ftypes/ftypes.c | 6 | ||||
-rw-r--r-- | epan/ftypes/ftypes.h | 10 |
18 files changed, 181 insertions, 127 deletions
diff --git a/epan/ftypes/.editorconfig b/epan/ftypes/.editorconfig index 97563d51ee..b7c5d2a3f8 100644 --- a/epan/ftypes/.editorconfig +++ b/epan/ftypes/.editorconfig @@ -32,7 +32,7 @@ indent_size = tab indent_style = tab indent_size = tab -[ftype-tvbuff.[ch]] +[ftype-protocol.[ch]] indent_style = tab indent_size = tab diff --git a/epan/ftypes/CMakeLists.txt b/epan/ftypes/CMakeLists.txt index 245ceb9052..6ddcb9fbee 100644 --- a/epan/ftypes/CMakeLists.txt +++ b/epan/ftypes/CMakeLists.txt @@ -35,9 +35,9 @@ set(FTYPE_FILES ftype-guid.c ftype-none.c ftype-pcre.c + ftype-protocol.c ftype-string.c ftype-time.c - ftype-tvbuff.c ) source_group(ftype FILES ${FTYPE_FILES}) diff --git a/epan/ftypes/Makefile.common b/epan/ftypes/Makefile.common index dba0bf6860..b8b9042c9e 100644 --- a/epan/ftypes/Makefile.common +++ b/epan/ftypes/Makefile.common @@ -37,9 +37,9 @@ NONGENERATED_C_FILES = \ ftype-guid.c \ ftype-none.c \ ftype-pcre.c \ + ftype-protocol.c \ ftype-string.c \ - ftype-time.c \ - ftype-tvbuff.c + ftype-time.c # Header files that are not generated from other files NONGENERATED_HEADER_FILES = \ diff --git a/epan/ftypes/ftype-bytes.c b/epan/ftypes/ftype-bytes.c index ab6ded9dfe..f5c1b74857 100644 --- a/epan/ftypes/ftype-bytes.c +++ b/epan/ftypes/ftype-bytes.c @@ -742,7 +742,7 @@ ftype_register_bytes(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -787,7 +787,7 @@ ftype_register_bytes(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -832,7 +832,7 @@ ftype_register_bytes(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_integer */ NULL, /* set_value_uinteger64 */ @@ -877,7 +877,7 @@ ftype_register_bytes(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_integer */ NULL, /* set_value_uinteger64 */ @@ -922,7 +922,7 @@ ftype_register_bytes(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -967,7 +967,7 @@ ftype_register_bytes(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1012,7 +1012,7 @@ ftype_register_bytes(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1057,7 +1057,7 @@ ftype_register_bytes(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1102,7 +1102,7 @@ ftype_register_bytes(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ diff --git a/epan/ftypes/ftype-double.c b/epan/ftypes/ftype-double.c index 1eb3c103d0..5a0812f1cb 100644 --- a/epan/ftypes/ftype-double.c +++ b/epan/ftypes/ftype-double.c @@ -175,7 +175,7 @@ ftype_register_double(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -220,7 +220,7 @@ ftype_register_double(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ diff --git a/epan/ftypes/ftype-guid.c b/epan/ftypes/ftype-guid.c index 1b88b70c13..f5731032ee 100644 --- a/epan/ftypes/ftype-guid.c +++ b/epan/ftypes/ftype-guid.c @@ -143,7 +143,7 @@ ftype_register_guid(void) guid_fvalue_set_guid, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ diff --git a/epan/ftypes/ftype-ieee-11073-float.c b/epan/ftypes/ftype-ieee-11073-float.c index 1a99b84367..3109e1ffd1 100644 --- a/epan/ftypes/ftype-ieee-11073-float.c +++ b/epan/ftypes/ftype-ieee-11073-float.c @@ -1443,7 +1443,7 @@ Example: 114 is 0x0072 NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ sfloat_ieee_11073_value_set, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1515,7 +1515,7 @@ Example: 36.4 is 0xFF00016C NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ float_ieee_11073_value_set, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ diff --git a/epan/ftypes/ftype-integer.c b/epan/ftypes/ftype-integer.c index 83345b92b6..2df16a6cd3 100644 --- a/epan/ftypes/ftype-integer.c +++ b/epan/ftypes/ftype-integer.c @@ -798,7 +798,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ set_uinteger, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -842,7 +842,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ set_uinteger, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -886,7 +886,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ set_uinteger, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -930,7 +930,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ set_uinteger, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -974,7 +974,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ set_uinteger64, /* set_value_uinteger64 */ @@ -1018,7 +1018,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ set_uinteger64, /* set_value_uinteger64 */ @@ -1062,7 +1062,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ set_uinteger64, /* set_value_uinteger64 */ @@ -1106,7 +1106,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ set_uinteger64, /* set_value_uinteger64 */ @@ -1150,7 +1150,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ set_sinteger, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1194,7 +1194,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ set_sinteger, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1238,7 +1238,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ set_sinteger, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1282,7 +1282,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ set_sinteger, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1326,7 +1326,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1370,7 +1370,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1414,7 +1414,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1458,7 +1458,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1502,7 +1502,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ set_uinteger64, /* set_value_uinteger64 */ @@ -1547,7 +1547,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ set_uinteger, /* set_value_uinteger */ NULL, /* get_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1592,7 +1592,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ set_uinteger, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -1637,7 +1637,7 @@ ftype_register_integers(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ set_uinteger64, /* set_value_uinteger64 */ diff --git a/epan/ftypes/ftype-ipv4.c b/epan/ftypes/ftype-ipv4.c index c189d42617..12b1ec00fe 100644 --- a/epan/ftypes/ftype-ipv4.c +++ b/epan/ftypes/ftype-ipv4.c @@ -190,7 +190,7 @@ ftype_register_ipv4(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ set_uinteger, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ diff --git a/epan/ftypes/ftype-ipv6.c b/epan/ftypes/ftype-ipv6.c index 6f33cb581c..9540fb25ca 100644 --- a/epan/ftypes/ftype-ipv6.c +++ b/epan/ftypes/ftype-ipv6.c @@ -242,7 +242,7 @@ ftype_register_ipv6(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ diff --git a/epan/ftypes/ftype-none.c b/epan/ftypes/ftype-none.c index 351c692b7a..7212e28439 100644 --- a/epan/ftypes/ftype-none.c +++ b/epan/ftypes/ftype-none.c @@ -44,7 +44,7 @@ ftype_register_none(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ diff --git a/epan/ftypes/ftype-pcre.c b/epan/ftypes/ftype-pcre.c index 8ea48afa31..e0ed16ab84 100644 --- a/epan/ftypes/ftype-pcre.c +++ b/epan/ftypes/ftype-pcre.c @@ -168,7 +168,7 @@ ftype_register_pcre(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ gregex_fvalue_set, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ diff --git a/epan/ftypes/ftype-tvbuff.c b/epan/ftypes/ftype-protocol.c index e44dd7f92a..35c449a701 100644 --- a/epan/ftypes/ftype-tvbuff.c +++ b/epan/ftypes/ftype-protocol.c @@ -33,25 +33,28 @@ static void value_new(fvalue_t *fv) { - fv->value.tvb = NULL; + fv->value.protocol.tvb = NULL; + fv->value.protocol.proto_string = NULL; fv->tvb_is_private = FALSE; } static void value_free(fvalue_t *fv) { - if (fv->value.tvb && fv->tvb_is_private) { - tvb_free_chain(fv->value.tvb); + if (fv->value.protocol.tvb && fv->tvb_is_private) { + tvb_free_chain(fv->value.protocol.tvb); } + g_free(fv->value.protocol.proto_string); } static void -value_set(fvalue_t *fv, tvbuff_t *value) +value_set(fvalue_t *fv, tvbuff_t *value, const gchar *name) { /* Free up the old value, if we have one */ value_free(fv); - fv->value.tvb = value; + fv->value.protocol.tvb = value; + fv->value.protocol.proto_string = g_strdup(name); } static void @@ -80,7 +83,8 @@ val_from_string(fvalue_t *fv, const char *s, gchar **err_msg _U_) /* And let us know that we need to free the tvbuff */ fv->tvb_is_private = TRUE; - fv->value.tvb = new_tvb; + fv->value.protocol.tvb = new_tvb; + fv->value.protocol.proto_string = g_strdup(s); return TRUE; } @@ -109,7 +113,7 @@ val_from_unparsed(fvalue_t *fv, const char *s, gboolean allow_partial_value _U_, /* And let us know that we need to free the tvbuff */ fv->tvb_is_private = TRUE; - fv->value.tvb = new_tvb; + fv->value.protocol.tvb = new_tvb; return TRUE; } @@ -127,7 +131,7 @@ val_repr_len(fvalue_t *fv, ftrepr_t rtype, int field_display _U_) TRY { /* 3 bytes for each byte of the byte "NN:" minus 1 byte * as there's no trailing ":". */ - length = tvb_captured_length(fv->value.tvb) * 3 - 1; + length = tvb_captured_length(fv->value.protocol.tvb) * 3 - 1; } CATCH_ALL { /* nothing */ @@ -145,10 +149,10 @@ val_to_repr(fvalue_t *fv, ftrepr_t rtype, int field_display _U_, char * volatile g_assert(rtype == FTREPR_DFILTER); TRY { - length = tvb_captured_length(fv->value.tvb); + length = tvb_captured_length(fv->value.protocol.tvb); if (length) - buf = bytes_to_hexstr_punct(buf, tvb_get_ptr(fv->value.tvb, 0, length), length, ':'); + buf = bytes_to_hexstr_punct(buf, tvb_get_ptr(fv->value.protocol.tvb, 0, length), length, ':'); *buf = '\0'; } CATCH_ALL { @@ -160,7 +164,7 @@ val_to_repr(fvalue_t *fv, ftrepr_t rtype, int field_display _U_, char * volatile static gpointer value_get(fvalue_t *fv) { - return fv->value.tvb; + return fv->value.protocol.tvb; } static guint @@ -169,8 +173,8 @@ len(fvalue_t *fv) volatile guint length = 0; TRY { - if (fv->value.tvb) - length = tvb_captured_length(fv->value.tvb); + if (fv->value.protocol.tvb) + length = tvb_captured_length(fv->value.protocol.tvb); } CATCH_ALL { /* nothing */ @@ -185,9 +189,9 @@ slice(fvalue_t *fv, GByteArray *bytes, guint offset, guint length) { const guint8* data; - if (fv->value.tvb) { + if (fv->value.protocol.tvb) { TRY { - data = tvb_get_ptr(fv->value.tvb, offset, length); + data = tvb_get_ptr(fv->value.protocol.tvb, offset, length); g_byte_array_append(bytes, data, length); } CATCH_ALL { @@ -201,15 +205,19 @@ slice(fvalue_t *fv, GByteArray *bytes, guint offset, guint length) static gboolean cmp_eq(const fvalue_t *fv_a, const fvalue_t *fv_b) { - tvbuff_t *a = fv_a->value.tvb; - tvbuff_t *b = fv_b->value.tvb; + protocol_value_t *a = (protocol_value_t*)&fv_a->value.protocol; + protocol_value_t *b = (protocol_value_t*)&fv_b->value.protocol; volatile gboolean eq = FALSE; TRY { - guint a_len = tvb_captured_length(a); + if ((a->tvb != NULL) && (b->tvb != NULL)) { + guint a_len = tvb_captured_length(a->tvb); - if (a_len == tvb_captured_length(b)) - eq = (memcmp(tvb_get_ptr(a, 0, a_len), tvb_get_ptr(b, 0, a_len), a_len) == 0); + if (a_len == tvb_captured_length(b->tvb)) + eq = (memcmp(tvb_get_ptr(a->tvb, 0, a_len), tvb_get_ptr(b->tvb, 0, a_len), a_len) == 0); + } else { + eq = (strcmp(a->proto_string, b->proto_string) == 0); + } } CATCH_ALL { /* nothing */ @@ -222,15 +230,18 @@ cmp_eq(const fvalue_t *fv_a, const fvalue_t *fv_b) static gboolean cmp_ne(const fvalue_t *fv_a, const fvalue_t *fv_b) { - tvbuff_t *a = fv_a->value.tvb; - tvbuff_t *b = fv_b->value.tvb; + protocol_value_t *a = (protocol_value_t*)&fv_a->value.protocol; + protocol_value_t *b = (protocol_value_t*)&fv_b->value.protocol; volatile gboolean ne = TRUE; TRY { - guint a_len = tvb_captured_length(a); + if ((a->tvb != NULL) && (b->tvb != NULL)) { + guint a_len = tvb_captured_length(a->tvb); - if (a_len == tvb_captured_length(b)) { - ne = (memcmp(tvb_get_ptr(a, 0, a_len), tvb_get_ptr(b, 0, a_len), a_len) != 0); + if (a_len == tvb_captured_length(b->tvb)) + ne = (memcmp(tvb_get_ptr(a->tvb, 0, a_len), tvb_get_ptr(b->tvb, 0, a_len), a_len) != 0); + } else { + ne = (strcmp(a->proto_string, b->proto_string) != 0); } } CATCH_ALL { @@ -244,18 +255,22 @@ cmp_ne(const fvalue_t *fv_a, const fvalue_t *fv_b) static gboolean cmp_gt(const fvalue_t *fv_a, const fvalue_t *fv_b) { - tvbuff_t *a = fv_a->value.tvb; - tvbuff_t *b = fv_b->value.tvb; + protocol_value_t *a = (protocol_value_t*)&fv_a->value.protocol; + protocol_value_t *b = (protocol_value_t*)&fv_b->value.protocol; volatile gboolean gt = FALSE; TRY { - guint a_len = tvb_captured_length(a); - guint b_len = tvb_captured_length(b); - - if (a_len > b_len) { - gt = TRUE; - } else if (a_len == b_len) { - gt = (memcmp(tvb_get_ptr(a, 0, a_len), tvb_get_ptr(b, 0, a_len), a_len) > 0); + if ((a->tvb != NULL) && (b->tvb != NULL)) { + guint a_len = tvb_captured_length(a->tvb); + guint b_len = tvb_captured_length(b->tvb); + + if (a_len > b_len) { + gt = TRUE; + } else if (a_len == b_len) { + gt = (memcmp(tvb_get_ptr(a->tvb, 0, a_len), tvb_get_ptr(b->tvb, 0, a_len), a_len) > 0); + } + } else { + return (strcmp(a->proto_string, b->proto_string) > 0); } } CATCH_ALL { @@ -269,18 +284,22 @@ cmp_gt(const fvalue_t *fv_a, const fvalue_t *fv_b) static gboolean cmp_ge(const fvalue_t *fv_a, const fvalue_t *fv_b) { - tvbuff_t *a = fv_a->value.tvb; - tvbuff_t *b = fv_b->value.tvb; + protocol_value_t *a = (protocol_value_t*)&fv_a->value.protocol; + protocol_value_t *b = (protocol_value_t*)&fv_b->value.protocol; volatile gboolean ge = FALSE; TRY { - guint a_len = tvb_captured_length(a); - guint b_len = tvb_captured_length(b); - - if (a_len > b_len) { - ge = TRUE; - } else if (a_len == b_len) { - ge = (memcmp(tvb_get_ptr(a, 0, a_len), tvb_get_ptr(b, 0, a_len), a_len) >= 0); + if ((a->tvb != NULL) && (b->tvb != NULL)) { + guint a_len = tvb_captured_length(a->tvb); + guint b_len = tvb_captured_length(b->tvb); + + if (a_len > b_len) { + ge = TRUE; + } else if (a_len == b_len) { + ge = (memcmp(tvb_get_ptr(a->tvb, 0, a_len), tvb_get_ptr(b->tvb, 0, a_len), a_len) >= 0); + } + } else { + return (strcmp(a->proto_string, b->proto_string) >= 0); } } CATCH_ALL { @@ -294,18 +313,22 @@ cmp_ge(const fvalue_t *fv_a, const fvalue_t *fv_b) static gboolean cmp_lt(const fvalue_t *fv_a, const fvalue_t *fv_b) { - tvbuff_t *a = fv_a->value.tvb; - tvbuff_t *b = fv_b->value.tvb; + protocol_value_t *a = (protocol_value_t*)&fv_a->value.protocol; + protocol_value_t *b = (protocol_value_t*)&fv_b->value.protocol; volatile gboolean lt = FALSE; TRY { - guint a_len = tvb_captured_length(a); - guint b_len = tvb_captured_length(b); - - if (a_len < b_len) { - lt = TRUE; - } else if (a_len == b_len) { - lt = (memcmp(tvb_get_ptr(a, 0, a_len), tvb_get_ptr(b, 0, a_len), a_len) < 0); + if ((a->tvb != NULL) && (b->tvb != NULL)) { + guint a_len = tvb_captured_length(a->tvb); + guint b_len = tvb_captured_length(b->tvb); + + if (a_len < b_len) { + lt = TRUE; + } else if (a_len == b_len) { + lt = (memcmp(tvb_get_ptr(a->tvb, 0, a_len), tvb_get_ptr(b->tvb, 0, a_len), a_len) < 0); + } + } else { + return (strcmp(a->proto_string, b->proto_string) < 0); } } CATCH_ALL { @@ -319,18 +342,22 @@ cmp_lt(const fvalue_t *fv_a, const fvalue_t *fv_b) static gboolean cmp_le(const fvalue_t *fv_a, const fvalue_t *fv_b) { - tvbuff_t *a = fv_a->value.tvb; - tvbuff_t *b = fv_b->value.tvb; + protocol_value_t *a = (protocol_value_t*)&fv_a->value.protocol; + protocol_value_t *b = (protocol_value_t*)&fv_b->value.protocol; volatile gboolean le = FALSE; TRY { - guint a_len = tvb_captured_length(a); - guint b_len = tvb_captured_length(b); - - if (a_len < b_len) { - le = TRUE; - } else if (a_len == b_len) { - le = (memcmp(tvb_get_ptr(a, 0, a_len), tvb_get_ptr(b, 0, a_len), a_len) <= 0); + if ((a->tvb != NULL) && (b->tvb != NULL)) { + guint a_len = tvb_captured_length(a->tvb); + guint b_len = tvb_captured_length(b->tvb); + + if (a_len < b_len) { + le = TRUE; + } else if (a_len == b_len) { + le = (memcmp(tvb_get_ptr(a->tvb, 0, a_len), tvb_get_ptr(b->tvb, 0, a_len), a_len) <= 0); + } + } else { + return (strcmp(a->proto_string, b->proto_string) <= 0); } } CATCH_ALL { @@ -344,11 +371,20 @@ cmp_le(const fvalue_t *fv_a, const fvalue_t *fv_b) static gboolean cmp_contains(const fvalue_t *fv_a, const fvalue_t *fv_b) { - volatile gboolean contains = FALSE; + volatile gboolean contains = FALSE; TRY { - if (tvb_find_tvb(fv_a->value.tvb, fv_b->value.tvb, 0) > -1) { - contains = TRUE; + /* First see if tvb exists for both sides */ + if ((fv_a->value.protocol.tvb != NULL) && (fv_b->value.protocol.tvb != NULL)) { + if (tvb_find_tvb(fv_a->value.protocol.tvb, fv_b->value.protocol.tvb, 0) > -1) { + contains = TRUE; + } + } else { + /* Otherwise just compare strings */ + if ((strlen(fv_b->value.protocol.proto_string) != 0) && + strstr(fv_a->value.protocol.proto_string, fv_b->value.protocol.proto_string)) { + contains = TRUE; + } } } CATCH_ALL { @@ -362,7 +398,7 @@ cmp_contains(const fvalue_t *fv_a, const fvalue_t *fv_b) static gboolean cmp_matches(const fvalue_t *fv_a, const fvalue_t *fv_b) { - tvbuff_t *tvb = fv_a->value.tvb; + protocol_value_t *a = (protocol_value_t*)&fv_a->value.protocol; GRegex *regex = fv_b->value.re; volatile gboolean rc = FALSE; const char *data = NULL; /* tvb data */ @@ -379,18 +415,30 @@ cmp_matches(const fvalue_t *fv_a, const fvalue_t *fv_b) return FALSE; } TRY { - tvb_len = tvb_captured_length(tvb); - data = (const char *)tvb_get_ptr(tvb, 0, tvb_len); - rc = g_regex_match_full( + if (a->tvb != NULL) { + tvb_len = tvb_captured_length(a->tvb); + data = (const char *)tvb_get_ptr(a->tvb, 0, tvb_len); + rc = g_regex_match_full( + regex, /* Compiled PCRE */ + data, /* The data to check for the pattern... */ + tvb_len, /* ... and its length */ + 0, /* Start offset within data */ + (GRegexMatchFlags)0, /* GRegexMatchFlags */ + NULL, /* We are not interested in the match information */ + NULL /* We don't want error information */ + ); + /* NOTE - DO NOT g_free(data) */ + } else { + rc = g_regex_match_full( regex, /* Compiled PCRE */ - data, /* The data to check for the pattern... */ - tvb_len, /* ... and its length */ + a->proto_string, /* The data to check for the pattern... */ + (int)strlen(a->proto_string), /* ... and its length */ 0, /* Start offset within data */ (GRegexMatchFlags)0, /* GRegexMatchFlags */ NULL, /* We are not interested in the match information */ NULL /* We don't want error information */ ); - /* NOTE - DO NOT g_free(data) */ + } } CATCH_ALL { return FALSE; @@ -420,7 +468,7 @@ ftype_register_tvbuff(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ NULL, /* set_value_string */ - value_set, /* set_value_tvbuff */ + value_set, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ diff --git a/epan/ftypes/ftype-string.c b/epan/ftypes/ftype-string.c index 143d481958..f952d01453 100644 --- a/epan/ftypes/ftype-string.c +++ b/epan/ftypes/ftype-string.c @@ -245,7 +245,7 @@ ftype_register_string(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ string_fvalue_set_string, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -289,7 +289,7 @@ ftype_register_string(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ string_fvalue_set_string, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -333,7 +333,7 @@ ftype_register_string(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ string_fvalue_set_string, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -377,7 +377,7 @@ ftype_register_string(void) NULL, /* set_value_guid */ NULL, /* set_value_time */ string_fvalue_set_string, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ diff --git a/epan/ftypes/ftype-time.c b/epan/ftypes/ftype-time.c index 34e3826246..c36bf14d5c 100644 --- a/epan/ftypes/ftype-time.c +++ b/epan/ftypes/ftype-time.c @@ -400,7 +400,7 @@ ftype_register_time(void) NULL, /* set_value_guid */ time_fvalue_set, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ @@ -444,7 +444,7 @@ ftype_register_time(void) NULL, /* set_value_guid */ time_fvalue_set, /* set_value_time */ NULL, /* set_value_string */ - NULL, /* set_value_tvbuff */ + NULL, /* set_value_protocol */ NULL, /* set_value_uinteger */ NULL, /* set_value_sinteger */ NULL, /* set_value_uinteger64 */ diff --git a/epan/ftypes/ftypes-int.h b/epan/ftypes/ftypes-int.h index 9fba4f1c55..fc35fee8f1 100644 --- a/epan/ftypes/ftypes-int.h +++ b/epan/ftypes/ftypes-int.h @@ -59,7 +59,7 @@ typedef void (*FvalueSetBytesFunc)(fvalue_t*, const guint8 *); typedef void (*FvalueSetGuidFunc)(fvalue_t*, const e_guid_t *); typedef void (*FvalueSetTimeFunc)(fvalue_t*, const nstime_t *); typedef void (*FvalueSetStringFunc)(fvalue_t*, const gchar *value); -typedef void (*FvalueSetTvbuffFunc)(fvalue_t*, tvbuff_t *value); +typedef void (*FvalueSetProtocolFunc)(fvalue_t*, tvbuff_t *value, const gchar *name); typedef void (*FvalueSetUnsignedIntegerFunc)(fvalue_t*, guint32); typedef void (*FvalueSetSignedIntegerFunc)(fvalue_t*, gint32); typedef void (*FvalueSetUnsignedInteger64Func)(fvalue_t*, guint64); @@ -96,7 +96,7 @@ struct _ftype_t { FvalueSetGuidFunc set_value_guid; FvalueSetTimeFunc set_value_time; FvalueSetStringFunc set_value_string; - FvalueSetTvbuffFunc set_value_tvbuff; + FvalueSetProtocolFunc set_value_protocol; FvalueSetUnsignedIntegerFunc set_value_uinteger; FvalueSetSignedIntegerFunc set_value_sinteger; FvalueSetUnsignedInteger64Func set_value_uinteger64; diff --git a/epan/ftypes/ftypes.c b/epan/ftypes/ftypes.c index 6f26f7249d..5425dbcdbe 100644 --- a/epan/ftypes/ftypes.c +++ b/epan/ftypes/ftypes.c @@ -531,10 +531,10 @@ fvalue_set_string(fvalue_t *fv, const gchar *value) } void -fvalue_set_tvbuff(fvalue_t *fv, tvbuff_t *value) +fvalue_set_protocol(fvalue_t *fv, tvbuff_t *value, const gchar *name) { - g_assert(fv->ftype->set_value_tvbuff); - fv->ftype->set_value_tvbuff(fv, value); + g_assert(fv->ftype->set_value_protocol); + fv->ftype->set_value_protocol(fv, value, name); } void diff --git a/epan/ftypes/ftypes.h b/epan/ftypes/ftypes.h index 92bc68f83f..0a29022f6f 100644 --- a/epan/ftypes/ftypes.h +++ b/epan/ftypes/ftypes.h @@ -197,6 +197,12 @@ ftype_can_matches(enum ftenum ftype); #include <wsutil/nstime.h> #include <epan/dfilter/drange.h> +typedef struct _protocol_value_t +{ + tvbuff_t *tvb; + gchar *proto_string; +} protocol_value_t; + typedef struct _fvalue_t { ftype_t *ftype; union { @@ -214,7 +220,7 @@ typedef struct _fvalue_t { ipv6_addr_and_prefix ipv6; e_guid_t guid; nstime_t time; - tvbuff_t *tvb; + protocol_value_t protocol; GRegex *re; guint16 sfloat_ieee_11073; guint32 float_ieee_11073; @@ -287,7 +293,7 @@ void fvalue_set_string(fvalue_t *fv, const gchar *value); void -fvalue_set_tvbuff(fvalue_t *fv, tvbuff_t *value); +fvalue_set_protocol(fvalue_t *fv, tvbuff_t *value, const gchar *name); void fvalue_set_uinteger(fvalue_t *fv, guint32 value); |