diff options
author | Michael Mann <mmann78@netscape.net> | 2013-10-06 02:31:10 +0000 |
---|---|---|
committer | Michael Mann <mmann78@netscape.net> | 2013-10-06 02:31:10 +0000 |
commit | ee208c8dcc371ca10986b7e8ea28c933e4bfaae9 (patch) | |
tree | 34da4ba8bde2ea6a7f071f47cd24bf2950f39331 /epan/ftypes | |
parent | 625fbd5f9a09483485f9c2b0271ab29afb68a597 (diff) |
Add support for RELATIVE-OID ASN.1 type. Bug 9192 (https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=9192)
From Ed Beroset.
svn path=/trunk/; revision=52393
Diffstat (limited to 'epan/ftypes')
-rw-r--r-- | epan/ftypes/ftype-bytes.c | 93 | ||||
-rw-r--r-- | epan/ftypes/ftypes.h | 1 |
2 files changed, 93 insertions, 1 deletions
diff --git a/epan/ftypes/ftype-bytes.c b/epan/ftypes/ftype-bytes.c index 07fef709f7..de7adac863 100644 --- a/epan/ftypes/ftype-bytes.c +++ b/epan/ftypes/ftype-bytes.c @@ -77,6 +77,8 @@ bytes_repr_len(fvalue_t *fv, ftrepr_t rtype _U_) * OID_REPR_LEN: * * 5 for the first byte ([0-2].[0-39].) + * + * REL_OID_REPR_LEN: * for each extra byte if the sub-id is: * 1 byte it can be at most "127." (4 bytes we give it 4) * 2 bytes it can be at most "16383." (6 bytes we give it 8) @@ -87,7 +89,8 @@ bytes_repr_len(fvalue_t *fv, ftrepr_t rtype _U_) * a 5 bytes encoded subid can already overflow the guint32 that holds a sub-id, * making it a completely different issue! */ -#define OID_REPR_LEN(fv) (5 + (4 * ((fv)->value.bytes->len-1))) +#define REL_OID_REPR_LEN(fv) (4 * ((fv)->value.bytes->len)) +#define OID_REPR_LEN(fv) (1 + REL_OID_REPR_LEN(fv)) static int oid_repr_len(fvalue_t *fv _U_, ftrepr_t rtype _U_) @@ -109,6 +112,27 @@ oid_to_repr(fvalue_t *fv, ftrepr_t rtype _U_, char *buf) strncpy(buf,oid_str,OID_REPR_LEN(fv)); } +static int +rel_oid_repr_len(fvalue_t *fv _U_, ftrepr_t rtype _U_) +{ + return REL_OID_REPR_LEN(fv); +} + +static void +rel_oid_to_repr(fvalue_t *fv, ftrepr_t rtype _U_, char *buf) +{ + const char* oid_str = rel_oid_encoded2string(fv->value.bytes->data,fv->value.bytes->len); + /* + * XXX: + * I'm assuming that oid_repr_len is going to be called before to set buf's size. + * or else we might have a BO. + * I guess that is why this callback is not passed a length. + * -- lego + */ + *buf++ = '.'; + strncpy(buf,oid_str,REL_OID_REPR_LEN(fv)); +} + static void bytes_to_repr(fvalue_t *fv, ftrepr_t rtype _U_, char *buf) { @@ -378,6 +402,34 @@ oid_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value _U_, LogFu return TRUE; } +static gboolean +rel_oid_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value _U_, LogFunc logfunc) +{ + GByteArray *bytes; + gboolean res; + + + /* + * Don't log a message if this fails; we'll try looking it + * up as an OID if it does, and if that fails, + * we'll log a message. + */ + bytes = g_byte_array_new(); + res = rel_oid_str_to_bytes(s, bytes, FALSE); + if (!res) { + if (logfunc != NULL) + logfunc("\"%s\" is not a valid RELATIVE-OID.", s); + g_byte_array_free(bytes, TRUE); + return FALSE; + } + + /* Free up the old value, if we have one */ + bytes_fvalue_free(fv); + fv->value.bytes = bytes; + + return TRUE; +} + static guint len(fvalue_t *fv) { @@ -811,10 +863,49 @@ ftype_register_bytes(void) slice, }; + static ftype_t rel_oid_type = { + FT_REL_OID, /* ftype */ + "FT_REL_OID", /* name */ + "ASN.1 relative object identifier", /* pretty_name */ + 0, /* wire_size */ + bytes_fvalue_new, /* new_value */ + bytes_fvalue_free, /* free_value */ + rel_oid_from_unparsed, /* val_from_unparsed */ + NULL, /* val_from_string */ + rel_oid_to_repr, /* val_to_string_repr */ + rel_oid_repr_len, /* len_string_repr */ + + oid_fvalue_set, /* set_value (same as full oid) */ + NULL, /* set_value_uinteger */ + NULL, /* set_value_sinteger */ + NULL, /* set_value_integer64 */ + NULL, /* set_value_floating */ + + value_get, /* get_value */ + NULL, /* get_value_uinteger */ + NULL, /* get_value_sinteger */ + NULL, /* get_value_integer64 */ + NULL, /* get_value_floating */ + + cmp_eq, + cmp_ne, + cmp_gt, + cmp_ge, + cmp_lt, + cmp_le, + cmp_bitwise_and, + cmp_contains, + NULL, /* cmp_matches */ + + len, + slice, + }; + ftype_register(FT_BYTES, &bytes_type); ftype_register(FT_UINT_BYTES, &uint_bytes_type); ftype_register(FT_AX25, &ax25_type); ftype_register(FT_VINES, &vines_type); ftype_register(FT_ETHER, ðer_type); ftype_register(FT_OID, &oid_type); + ftype_register(FT_REL_OID, &rel_oid_type); } diff --git a/epan/ftypes/ftypes.h b/epan/ftypes/ftypes.h index 11c850b6ce..5f4183a3b9 100644 --- a/epan/ftypes/ftypes.h +++ b/epan/ftypes/ftypes.h @@ -69,6 +69,7 @@ enum ftenum { FT_EUI64, FT_AX25, FT_VINES, + FT_REL_OID, /* RELATIVE-OID */ FT_NUM_TYPES /* last item number plus one */ }; |