guids: wmem-scope lookups

Avoids the use of the global unprotected packet memory pool and lets the
compiler enforce scoping.
This commit is contained in:
Evan Huus 2021-09-28 15:04:23 -04:00
parent 440bbd37a0
commit 3cdada3e7b
10 changed files with 36 additions and 35 deletions

View File

@ -334,7 +334,7 @@ epm_dissect_tower_data (tvbuff_t *tvb, int offset,
case PROTO_ID_UUID:
dcerpc_tvb_get_uuid (tvb, offset+1, &u8little_endian, &uuid);
uuid_name = guids_get_uuid_name(&uuid);
uuid_name = guids_get_uuid_name(&uuid, pinfo->pool);
if(uuid_name != NULL) {
proto_tree_add_guid_format (tr, hf_epm_uuid, tvb, offset+1, 16, (e_guid_t *) &uuid,

View File

@ -3502,7 +3502,7 @@ dissect_sec_vt_pcontext(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb)
const char *uuid_name;
tvb_get_letohguid(tvb, offset, &uuid);
uuid_name = guids_get_uuid_name(&uuid);
uuid_name = guids_get_uuid_name(&uuid, pinfo->pool);
if (!uuid_name) {
uuid_name = guid_to_str(pinfo->pool, &uuid);
}
@ -3516,7 +3516,7 @@ dissect_sec_vt_pcontext(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb)
offset += 4;
tvb_get_letohguid(tvb, offset, &uuid);
uuid_name = guids_get_uuid_name(&uuid);
uuid_name = guids_get_uuid_name(&uuid, pinfo->pool);
if (!uuid_name) {
uuid_name = guid_to_str(pinfo->pool, &uuid);
}
@ -3762,7 +3762,7 @@ dcerpc_try_handoff(packet_info *pinfo, proto_tree *tree,
tvb, offset, 0, TRUE);
proto_item_set_hidden(hidden_item);
col_append_fstr(pinfo->cinfo, COL_INFO, " %s V%u",
guids_resolve_guid_to_str(&info->call_data->uuid), info->call_data->ver);
guids_resolve_guid_to_str(&info->call_data->uuid, pinfo->pool), info->call_data->ver);
show_stub_data(pinfo, tvb, 0, dcerpc_tree, auth_info, !decrypted);
return -1;
@ -4063,7 +4063,7 @@ dissect_dcerpc_cn_bind(tvbuff_t *tvb, gint offset, packet_info *pinfo,
iface_tree = proto_item_add_subtree(iface_item, ett_dcerpc_cn_iface);
uuid_str = guid_to_str(pinfo->pool, (e_guid_t*)&if_id);
uuid_name = guids_get_uuid_name(&if_id);
uuid_name = guids_get_uuid_name(&if_id, pinfo->pool);
if (uuid_name) {
proto_tree_add_guid_format(iface_tree, hf_dcerpc_cn_bind_if_id, tvb,
offset, 16, (e_guid_t *) &if_id, "Interface: %s UUID: %s", uuid_name, uuid_str);
@ -4107,7 +4107,7 @@ dissect_dcerpc_cn_bind(tvbuff_t *tvb, gint offset, packet_info *pinfo,
trans_tree = proto_item_add_subtree(trans_item, ett_dcerpc_cn_trans_syntax);
uuid_str = guid_to_str(pinfo->pool, (e_guid_t *) &trans_id);
uuid_name = guids_get_uuid_name(&trans_id);
uuid_name = guids_get_uuid_name(&trans_id, pinfo->pool);
/* check for [MS-RPCE] 3.3.1.5.3 Bind Time Feature Negotiation */
if (trans_id.data1 == 0x6cb71c2c && trans_id.data2 == 0x9812 && trans_id.data3 == 0x4540) {
@ -4173,8 +4173,8 @@ dissect_dcerpc_cn_bind(tvbuff_t *tvb, gint offset, packet_info *pinfo,
if (i > 0)
col_append_fstr(pinfo->cinfo, COL_INFO, ",");
col_append_fstr(pinfo->cinfo, COL_INFO, " %s V%u.%u (%s)",
guids_resolve_guid_to_str(&if_id), if_ver, if_ver_minor,
guids_resolve_guid_to_str(&trans_id));
guids_resolve_guid_to_str(&if_id, pinfo->pool), if_ver, if_ver_minor,
guids_resolve_guid_to_str(&trans_id, pinfo->pool));
if (ctx_tree) {
proto_item_set_len(ctx_item, offset - ctx_offset);
@ -4271,7 +4271,7 @@ dissect_dcerpc_cn_bind_ack(tvbuff_t *tvb, gint offset, packet_info *pinfo,
if (ctx_tree) {
dcerpc_tvb_get_uuid(tvb, offset, hdr->drep, &trans_id);
uuid_name = guids_get_uuid_name(&trans_id);
uuid_name = guids_get_uuid_name(&trans_id, pinfo->pool);
if (! uuid_name) {
uuid_name = guid_to_str(pinfo->pool, (e_guid_t *) &trans_id);
}
@ -6525,7 +6525,7 @@ dissect_dcerpc_dg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat
if (tree) {
uuid_str = guid_to_str(pinfo->pool, (e_guid_t*)&hdr.if_id);
uuid_name = guids_get_uuid_name(&hdr.if_id);
uuid_name = guids_get_uuid_name(&hdr.if_id, pinfo->pool);
if (uuid_name) {
proto_tree_add_guid_format(dcerpc_tree, hf_dcerpc_dg_if_id, tvb,
offset, 16, (e_guid_t *) &hdr.if_id, "Interface: %s UUID: %s", uuid_name, uuid_str);

View File

@ -248,7 +248,7 @@ dissect_remunk_remrelease_rqst(tvbuff_t *tvb, int offset,
/* update subtree */
proto_item_append_text(sub_item, "[%u]: IPID=%s, PublicRefs=%u, PrivateRefs=%u",
u32ItemIdx,
guids_resolve_guid_to_str(&ipid),
guids_resolve_guid_to_str(&ipid, pinfo->pool),
u32PublicRefs, u32PrivateRefs);
proto_item_set_len(sub_item, offset - u32SubStart);

View File

@ -726,7 +726,7 @@ dissect_dcom_extent(tvbuff_t *tvb, int offset,
hf_dcom_extent_id, &uuidExtend);
/* look for a registered uuid name */
if((uuid_name = guids_get_uuid_name(&uuidExtend)) != NULL) {
if((uuid_name = guids_get_uuid_name(&uuidExtend, pinfo->pool)) != NULL) {
proto_tree_add_guid_format_value(sub_tree, hf_dcom_extent_id, tvb,
offset, sizeof(e_guid_t), (e_guid_t *) &uuidExtend,
"%s (%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x)",
@ -804,13 +804,13 @@ dissect_dcom_this(tvbuff_t *tvb, int offset,
/* update subtree header */
proto_item_append_text(sub_item, ", V%u.%u, Causality ID: %s",
u16VersionMajor, u16VersionMinor, guids_resolve_guid_to_str(&uuidCausality));
u16VersionMajor, u16VersionMinor, guids_resolve_guid_to_str(&uuidCausality, pinfo->pool));
proto_item_set_len(sub_item, offset - u32SubStart);
if(memcmp(&di->call_data->object_uuid, &uuid_null, sizeof(uuid_null)) != 0) {
pi = proto_tree_add_guid_format(tree, hf_dcom_ipid, tvb, offset, 0,
(e_guid_t *) &di->call_data->object_uuid,
"Object UUID/IPID: %s", guids_resolve_guid_to_str(&di->call_data->object_uuid));
"Object UUID/IPID: %s", guids_resolve_guid_to_str(&di->call_data->object_uuid, pinfo->pool));
proto_item_set_generated(pi);
}
@ -844,7 +844,7 @@ dissect_dcom_that(tvbuff_t *tvb, int offset,
if(memcmp(&di->call_data->object_uuid, &uuid_null, sizeof(uuid_null)) != 0) {
pi = proto_tree_add_guid_format(tree, hf_dcom_ipid, tvb, offset, 0,
(e_guid_t *) &di->call_data->object_uuid,
"Object UUID/IPID: %s", guids_resolve_guid_to_str(&di->call_data->object_uuid));
"Object UUID/IPID: %s", guids_resolve_guid_to_str(&di->call_data->object_uuid, pinfo->pool));
proto_item_set_generated(pi);
}
@ -1472,7 +1472,7 @@ dissect_dcom_UUID(tvbuff_t *tvb, int offset,
/* add to the tree */
hfi = proto_registrar_get_nth(hfindex);
uuid_name = guids_get_uuid_name(&uuid);
uuid_name = guids_get_uuid_name(&uuid, pinfo->pool);
if(uuid_name) {
proto_tree_add_guid_format(tree, hfindex, tvb, offset-16, 16, (e_guid_t *) &uuid,
"%s: %s (%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x)",
@ -1518,7 +1518,7 @@ dissect_dcom_append_UUID(tvbuff_t *tvb, int offset,
hfindex, uuid);
/* look for a registered uuid name */
uuid_name = guids_get_uuid_name(uuid);
uuid_name = guids_get_uuid_name(uuid, pinfo->pool);
/* add to the tree */
hfi = proto_registrar_get_nth(hfindex);
@ -1912,7 +1912,7 @@ dissect_dcom_STDOBJREF(tvbuff_t *tvb, gint offset, packet_info *pinfo,
/* append info to subtree header */
proto_item_append_text(sub_item, ": PublicRefs=%u IPID=%s",
u32PublicRefs, guids_resolve_guid_to_str(ipid));
u32PublicRefs, guids_resolve_guid_to_str(ipid, pinfo->pool));
proto_item_set_len(sub_item, offset - u32SubStart);
return offset;

View File

@ -270,7 +270,7 @@ dissect_dtpt_guid(tvbuff_t *tvb, guint offset, proto_tree *tree, int hfindex)
}
dtpt_guid_item = proto_tree_add_guid(tree, hfindex, tvb, offset, 4 + guid_length, &guid);
if (dtpt_guid_item) {
guid_name = guids_get_guid_name(&guid);
guid_name = guids_get_guid_name(&guid, wmem_packet_scope());
if (guid_name != NULL)
proto_item_set_text(dtpt_guid_item, "%s: %s (%s)",
proto_registrar_get_name(hfindex), guid_name, guid_to_str(wmem_packet_scope(), &guid));

View File

@ -162,7 +162,7 @@ dissect_etw(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree _U_, void* data
col_set_str(pinfo->cinfo, COL_PROTOCOL, provider_name);
}
} else {
col_set_str(pinfo->cinfo, COL_INFO, guids_resolve_guid_to_str(&provider_id));
col_set_str(pinfo->cinfo, COL_INFO, guids_resolve_guid_to_str(&provider_id, pinfo->pool));
}
etw_counter += 1;

View File

@ -2960,7 +2960,7 @@ static void get_name_from_fullpropspec(struct CFullPropSpec *v, char *out, int b
if (id_str) {
g_snprintf(dest, bufsize, "%s", id_str);
} else {
guid_str = guids_get_guid_name(&v->guid);
guid_str = guids_get_guid_name(&v->guid, wmem_packet_scope());
if (guid_str) {
g_snprintf(dest, bufsize, "\"%s\"", guid_str);
} else {
@ -3029,7 +3029,7 @@ static int parse_guid(tvbuff_t *tvb, int offset, proto_tree *tree, e_guid_t *gui
tvb_get_letohguid(tvb, offset, guid);
guid_str = guid_to_str(wmem_packet_scope(), guid);
name = guids_get_guid_name(guid);
name = guids_get_guid_name(guid, wmem_packet_scope());
tr = proto_tree_add_subtree_format(tree, tvb, offset, 16, ett_GUID, NULL, "%s: %s {%s}", text, name ? name : "", guid_str);
@ -3395,7 +3395,7 @@ static int parse_CFullPropSpec(tvbuff_t *tvb, int offset, proto_tree *parent_tre
if (id_str) {
proto_item_append_text(item, ": %s", id_str);
} else {
guid_str = guids_get_guid_name(&v->guid);
guid_str = guids_get_guid_name(&v->guid, wmem_packet_scope());
if (guid_str) {
proto_item_append_text(item, ": \"%s\"", guid_str);
} else {

View File

@ -107,9 +107,9 @@ guids_add_guid(const e_guid_t *guid, const gchar *name)
}
/* retrieve the registered name for this GUID */
/* retrieve the registered name for this GUID; uses the scope for the fallback case only */
const gchar *
guids_get_guid_name(const e_guid_t *guid)
guids_get_guid_name(const e_guid_t *guid, wmem_allocator_t *scope _U_)
{
wmem_tree_key_t guidkey[2];
guint32 g[4];
@ -151,7 +151,7 @@ guids_get_guid_name(const e_guid_t *guid)
#ifdef _WIN32
/* try to resolve the mapping from the Windows registry */
/* XXX - prefill the resolving database with all the Windows registry entries once at init only (instead of searching each time)? */
uuid_name=wmem_alloc(wmem_packet_scope(), 128);
uuid_name=wmem_alloc(scope, 128);
if(ResolveWin32UUID(*guid, uuid_name, 128)) {
return uuid_name;
}
@ -171,19 +171,19 @@ guids_init(void)
/* Tries to match a guid against its name.
Returns the associated string ptr on a match.
Formats uuid number and returns the resulting string, if name is unknown.
Formats uuid number and returns the resulting string via wmem scope, if name is unknown.
(derived from val_to_str) */
const gchar *
guids_resolve_guid_to_str(const e_guid_t *guid)
guids_resolve_guid_to_str(const e_guid_t *guid, wmem_allocator_t *scope)
{
const gchar *name;
name=guids_get_guid_name(guid);
name=guids_get_guid_name(guid, scope);
if(name){
return name;
}
return wmem_strdup_printf(wmem_packet_scope(), "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
return wmem_strdup_printf(scope, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
guid->data1, guid->data2, guid->data3,
guid->data4[0], guid->data4[1],
guid->data4[2], guid->data4[3],

View File

@ -13,6 +13,7 @@
#define __GUID_UTILS_H__
#include "ws_symbol_export.h"
#include <wsutil/wmem/wmem.h>
#define GUID_LEN 16
@ -35,17 +36,17 @@ WS_DLL_PUBLIC void guids_init(void);
WS_DLL_PUBLIC void guids_add_guid(const e_guid_t *guid, const gchar *name);
/* try to get registered name for this GUID */
WS_DLL_PUBLIC const gchar *guids_get_guid_name(const e_guid_t *guid);
WS_DLL_PUBLIC const gchar *guids_get_guid_name(const e_guid_t *guid, wmem_allocator_t *scope);
/* resolve GUID to name (or if unknown to hex string) */
/* (if you need hex string only, use guid_to_str instead) */
WS_DLL_PUBLIC const gchar* guids_resolve_guid_to_str(const e_guid_t *guid);
WS_DLL_PUBLIC const gchar* guids_resolve_guid_to_str(const e_guid_t *guid, wmem_allocator_t *scope);
/* add a UUID (dcerpc_init_uuid() will call this too) */
#define guids_add_uuid(uuid, name) guids_add_guid((const e_guid_t *) (uuid), (name))
/* try to get registered name for this UUID */
#define guids_get_uuid_name(uuid) guids_get_guid_name((e_guid_t *) (uuid))
#define guids_get_uuid_name(uuid, scope) guids_get_guid_name((e_guid_t *) (uuid), scope)
/* resolve UUID to name (or if unknown to hex string) */
/* (if you need hex string only, use guid_to_str instead) */

View File

@ -470,11 +470,11 @@ cba_pdev_find(packet_info *pinfo, const address *addr, e_guid_t *ipid)
pdev = (cba_pdev_t *)interf->parent->private_data;
if (pdev == NULL) {
expert_add_info_format(pinfo, NULL, &ei_cba_acco_pdev_find, "pdev_find: no pdev for IP:%s IPID:%s",
address_to_str(pinfo->pool, addr), guids_resolve_guid_to_str(ipid));
address_to_str(pinfo->pool, addr), guids_resolve_guid_to_str(ipid, pinfo->pool));
}
} else {
expert_add_info_format(pinfo, NULL, &ei_cba_acco_pdev_find_unknown_interface, "pdev_find: unknown interface of IP:%s IPID:%s",
address_to_str(pinfo->pool, addr), guids_resolve_guid_to_str(ipid));
address_to_str(pinfo->pool, addr), guids_resolve_guid_to_str(ipid, pinfo->pool));
pdev = NULL;
}