alljoyn: Use a FT_CHAR and value_string for the type id

The type id is a natural FT_CHAR, which is much easier than
using a custom formatting function. This also avoids creating
bogus UTF-8

Fix #18582.
This commit is contained in:
John Thacker 2022-11-02 21:42:32 -04:00
parent 3e0ee841b1
commit df4a0f289c
1 changed files with 25 additions and 37 deletions

View File

@ -639,6 +639,28 @@ handle_message_header_expected_byte(tvbuff_t *tvb,
#define ARG_STRUCT '(' /* AllJoyn struct container type */
#define ARG_DICT_ENTRY '{' /* AllJoyn dictionary or map container type - an array of key-value pairs */
static const value_string header_type_vals[] = {
{ ARG_INVALID, "invalid" },
{ ARG_ARRAY, "array" },
{ ARG_BOOLEAN, "boolean" },
{ ARG_DOUBLE, "IEEE 754 double" },
{ ARG_SIGNATURE, "signature" },
{ ARG_HANDLE, "socket handle" },
{ ARG_INT32, "int32" },
{ ARG_INT16, "int16" },
{ ARG_OBJ_PATH, "object path" },
{ ARG_UINT16, "uint16" },
{ ARG_STRING, "string" },
{ ARG_UINT64, "uint64" },
{ ARG_UINT32, "uint32" },
{ ARG_VARIANT, "variant" },
{ ARG_INT64, "int64" },
{ ARG_BYTE, "byte" },
{ ARG_STRUCT, "structure" },
{ ARG_DICT_ENTRY, "dictionary" },
{ 0, NULL }
};
static gint
pad_according_to_type(gint offset, gint field_starting_offset, gint max_offset, guint8 type)
{
@ -865,12 +887,10 @@ parse_arg(tvbuff_t *tvb,
gint length;
gint padding_start;
gint saved_offset = offset;
const gchar *header_type_name = NULL;
switch(type_id)
{
case ARG_INVALID:
header_type_name = "invalid";
offset = round_to_8byte(offset + 1, field_starting_offset);
break;
@ -884,10 +904,8 @@ parse_arg(tvbuff_t *tvb,
gint number_of_items = 0;
gint packet_length = (gint)tvb_reported_length(tvb);
header_type_name = "array";
if(*signature == NULL || *signature_length < 1) {
col_add_fstr(pinfo->cinfo, COL_INFO, "BAD DATA: A %s argument needs a signature.", header_type_name);
col_add_fstr(pinfo->cinfo, COL_INFO, "BAD DATA: An array argument needs a signature.");
return tvb_reported_length(tvb);
}
@ -955,7 +973,6 @@ parse_arg(tvbuff_t *tvb,
break;
case ARG_BOOLEAN: /* AllJoyn boolean basic type */
header_type_name = "boolean";
padding_start = offset;
offset = round_to_4byte(offset, field_starting_offset);
add_padding_item(padding_start, offset, tvb, field_tree);
@ -965,7 +982,6 @@ parse_arg(tvbuff_t *tvb,
break;
case ARG_DOUBLE: /* AllJoyn IEEE 754 double basic type */
header_type_name = "IEEE 754 double";
padding_start = offset;
offset = round_to_8byte(offset, field_starting_offset);
add_padding_item(padding_start, offset, tvb, field_tree);
@ -975,7 +991,6 @@ parse_arg(tvbuff_t *tvb,
break;
case ARG_SIGNATURE: /* AllJoyn signature basic type */
header_type_name = "signature";
length = tvb_get_guint8(tvb, offset);
if (length + 2 > tvb_reported_length_remaining(tvb, offset)) {
@ -1005,7 +1020,6 @@ parse_arg(tvbuff_t *tvb,
break;
case ARG_HANDLE: /* AllJoyn socket handle basic type. */
header_type_name = "socket handle";
padding_start = offset;
offset = round_to_4byte(offset, field_starting_offset);
add_padding_item(padding_start, offset, tvb, field_tree);
@ -1015,7 +1029,6 @@ parse_arg(tvbuff_t *tvb,
break;
case ARG_INT32: /* AllJoyn 32-bit signed integer basic type. */
header_type_name = "int32";
padding_start = offset;
offset = round_to_4byte(offset, field_starting_offset);
add_padding_item(padding_start, offset, tvb, field_tree);
@ -1025,7 +1038,6 @@ parse_arg(tvbuff_t *tvb,
break;
case ARG_INT16: /* AllJoyn 16-bit signed integer basic type. */
header_type_name = "int16";
padding_start = offset;
offset = round_to_2byte(offset, field_starting_offset);
add_padding_item(padding_start, offset, tvb, field_tree);
@ -1035,7 +1047,6 @@ parse_arg(tvbuff_t *tvb,
break;
case ARG_OBJ_PATH: /* AllJoyn Name of an AllJoyn object instance basic type */
header_type_name = "object path";
length = get_uint32(tvb, offset, encoding) + 1;
/* The + 4 is for the length specifier. Object paths may be of "any length"
@ -1054,7 +1065,6 @@ parse_arg(tvbuff_t *tvb,
break;
case ARG_UINT16: /* AllJoyn 16-bit unsigned integer basic type */
header_type_name = "uint16";
padding_start = offset;
offset = round_to_2byte(offset, field_starting_offset);
add_padding_item(padding_start, offset, tvb, field_tree);
@ -1067,7 +1077,6 @@ parse_arg(tvbuff_t *tvb,
{
const guint8 *member_name;
header_type_name = "string";
padding_start = offset;
offset = round_to_4byte(offset, field_starting_offset);
add_padding_item(padding_start, offset, tvb, field_tree);
@ -1097,7 +1106,6 @@ parse_arg(tvbuff_t *tvb,
break;
case ARG_UINT64: /* AllJoyn 64-bit unsigned integer basic type */
header_type_name = "uint64";
padding_start = offset;
offset = round_to_8byte(offset, field_starting_offset);
add_padding_item(padding_start, offset, tvb, field_tree);
@ -1107,7 +1115,6 @@ parse_arg(tvbuff_t *tvb,
break;
case ARG_UINT32: /* AllJoyn 32-bit unsigned integer basic type */
header_type_name = "uint32";
padding_start = offset;
offset = round_to_4byte(offset, field_starting_offset);
add_padding_item(padding_start, offset, tvb, field_tree);
@ -1140,8 +1147,6 @@ parse_arg(tvbuff_t *tvb,
const guint8 *sig_pointer;
guint8 variant_sig_length;
header_type_name = "variant";
variant_sig_length = tvb_get_guint8(tvb, offset);
length = variant_sig_length;
@ -1183,7 +1188,6 @@ parse_arg(tvbuff_t *tvb,
break;
case ARG_INT64: /* AllJoyn 64-bit signed integer basic type */
header_type_name = "int64";
padding_start = offset;
offset = round_to_8byte(offset, field_starting_offset);
add_padding_item(padding_start, offset, tvb, field_tree);
@ -1193,7 +1197,6 @@ parse_arg(tvbuff_t *tvb,
break;
case ARG_BYTE: /* AllJoyn 8-bit unsigned integer basic type */
header_type_name = "byte";
proto_tree_add_item(field_tree, hf_alljoyn_uint8, tvb, offset, 1, encoding);
offset += 1;
@ -1208,17 +1211,15 @@ parse_arg(tvbuff_t *tvb,
guint8 type_stop;
if(type_id == ARG_STRUCT) {
header_type_name = "structure";
hf = hf_alljoyn_mess_body_structure;
type_stop = ')';
} else {
header_type_name = "dictionary";
hf = hf_alljoyn_mess_body_dictionary_entry;
type_stop = '}';
}
if(*signature == NULL || *signature_length < 1) {
col_add_fstr(pinfo->cinfo, COL_INFO, "BAD DATA: A %s argument needs a signature.", header_type_name);
col_add_fstr(pinfo->cinfo, COL_INFO, "BAD DATA: A %s argument needs a signature.", val_to_str_const(type_id, header_type_vals, "Unexpected type"));
return tvb_reported_length(tvb);
}
@ -1256,7 +1257,6 @@ parse_arg(tvbuff_t *tvb,
break;
default:
header_type_name = "unexpected";
/* Just say we are done with this packet. */
offset = tvb_reported_length(tvb);
break;
@ -1267,12 +1267,6 @@ parse_arg(tvbuff_t *tvb,
(*signature_length)--;
}
if(NULL != header_item && NULL != header_type_name) {
/* Using "%s" and the argument "header_type_name" because some compilers don't like
"header_type_name" by itself. */
proto_item_append_text(header_item, "%s", header_type_name);
}
/* Make sure we never return something longer than the buffer for an offset. */
if(offset > (gint)tvb_reported_length(tvb)) {
offset = (gint)tvb_reported_length(tvb);
@ -1286,12 +1280,6 @@ parse_arg(tvbuff_t *tvb,
return offset;
}
static void
alljoyn_typeid( gchar *result, guint32 type )
{
snprintf( result, ITEM_LABEL_LENGTH, "'%c' => ", type);
}
/* This is called by handle_message_header_fields() to handle a single
* message header field.
* @param tvb is the incoming network data buffer.
@ -2757,7 +2745,7 @@ proto_register_AllJoyn(void)
},
{&hf_alljoyn_mess_body_header_typeid,
{"Type ID", "alljoyn.message.typeid",
FT_UINT8, BASE_CUSTOM, CF_FUNC(alljoyn_typeid), 0,
FT_CHAR, BASE_HEX, VALS(header_type_vals), 0,
NULL, HFILL}
},