forked from osmocom/wireshark
xmpp/xml: Store item length in xml_frame.
The created XML proto_item can be faked (if not visible and not referenced), so ensure we store the correct item length to be used in XMPP. This will avoid an invalid "Malformed Packet" for some XMPP packets. Change-Id: I79d805b725dbeb93f26a38b72bdcc84187aee16f Reviewed-on: https://code.wireshark.org/review/17324 Petri-Dish: Stig Bjørlykke <stig@bjorlykke.org> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
This commit is contained in:
parent
f597234785
commit
ce9a4b212e
|
@ -200,6 +200,7 @@ dissect_xml(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
|
|||
|
||||
tt = tvbparse_init(tvb, 0, -1, stack, want_ignore);
|
||||
current_frame->start_offset = 0;
|
||||
current_frame->length = tvb_captured_length(tvb);
|
||||
|
||||
root_ns = NULL;
|
||||
|
||||
|
@ -338,6 +339,7 @@ static void after_token(void *tvbparse_data, const void *wanted_data _U_, tvbpar
|
|||
new_frame->last_item = pi;
|
||||
new_frame->tree = NULL;
|
||||
new_frame->start_offset = tok->offset;
|
||||
new_frame->length = tok->len;
|
||||
new_frame->ns = NULL;
|
||||
new_frame->pinfo = current_frame->pinfo;
|
||||
}
|
||||
|
@ -382,6 +384,7 @@ static void before_xmpli(void *tvbparse_data, const void *wanted_data _U_, tvbpa
|
|||
new_frame->last_item = pi;
|
||||
new_frame->tree = pt;
|
||||
new_frame->start_offset = tok->offset;
|
||||
new_frame->length = tok->len;
|
||||
new_frame->ns = ns;
|
||||
new_frame->pinfo = current_frame->pinfo;
|
||||
|
||||
|
@ -471,6 +474,7 @@ static void before_tag(void *tvbparse_data, const void *wanted_data _U_, tvbpars
|
|||
new_frame->last_item = pi;
|
||||
new_frame->tree = pt;
|
||||
new_frame->start_offset = tok->offset;
|
||||
new_frame->length = tok->len;
|
||||
new_frame->ns = ns;
|
||||
new_frame->pinfo = current_frame->pinfo;
|
||||
|
||||
|
@ -507,6 +511,7 @@ static void after_untag(void *tvbparse_data, const void *wanted_data _U_, tvbpar
|
|||
xml_frame_t *current_frame = (xml_frame_t *)g_ptr_array_index(stack, stack->len - 1);
|
||||
|
||||
proto_item_set_len(current_frame->item, (tok->offset - current_frame->start_offset) + tok->len);
|
||||
current_frame->length = (tok->offset - current_frame->start_offset) + tok->len;
|
||||
|
||||
proto_tree_add_format_text(current_frame->tree, tok->tvb, tok->offset, tok->len);
|
||||
|
||||
|
@ -542,6 +547,7 @@ static void before_dtd_doctype(void *tvbparse_data, const void *wanted_data _U_,
|
|||
new_frame->last_item = dtd_item;
|
||||
new_frame->tree = proto_item_add_subtree(dtd_item, ett_dtd);
|
||||
new_frame->start_offset = tok->offset;
|
||||
new_frame->length = tok->len;
|
||||
new_frame->ns = NULL;
|
||||
new_frame->pinfo = current_frame->pinfo;
|
||||
|
||||
|
@ -620,6 +626,7 @@ static void after_attrib(void *tvbparse_data, const void *wanted_data _U_, tvbpa
|
|||
new_frame->last_item = pi;
|
||||
new_frame->tree = NULL;
|
||||
new_frame->start_offset = tok->offset;
|
||||
new_frame->length = tok->len;
|
||||
new_frame->ns = NULL;
|
||||
new_frame->pinfo = current_frame->pinfo;
|
||||
|
||||
|
|
|
@ -76,6 +76,7 @@ typedef struct _xml_frame_t {
|
|||
proto_item* last_item;
|
||||
xml_ns_t* ns;
|
||||
int start_offset;
|
||||
int length;
|
||||
packet_info* pinfo;
|
||||
} xml_frame_t;
|
||||
|
||||
|
|
|
@ -536,12 +536,8 @@ xmpp_xml_frame_to_element_t(xml_frame_t *xml_frame, xmpp_element_t *parent, tvbu
|
|||
g_hash_table_insert(node->namespaces, (gpointer)"", (gpointer)"jabber:client");
|
||||
}
|
||||
|
||||
if(xml_frame->item != NULL)
|
||||
{
|
||||
node->length = xml_frame->item->finfo->length;
|
||||
}
|
||||
|
||||
node->offset = xml_frame->start_offset;
|
||||
node->length = xml_frame->length;
|
||||
|
||||
tt = tvbparse_init(tvb,node->offset,-1,NULL,want_ignore);
|
||||
|
||||
|
@ -573,12 +569,8 @@ xmpp_xml_frame_to_element_t(xml_frame_t *xml_frame, xmpp_element_t *parent, tvbu
|
|||
tvb_memcpy(child->value, value, 0, l);
|
||||
}
|
||||
|
||||
if(child->item)
|
||||
{
|
||||
attr->length = child->item->finfo->length;
|
||||
}
|
||||
|
||||
attr->offset = child->start_offset;
|
||||
attr->length = child->length;
|
||||
attr->value = value;
|
||||
attr->name = wmem_strdup(wmem_packet_scope(), child->name_orig_case);
|
||||
|
||||
|
@ -618,11 +610,8 @@ xmpp_xml_frame_to_element_t(xml_frame_t *xml_frame, xmpp_element_t *parent, tvbu
|
|||
|
||||
data->value = value;
|
||||
|
||||
if(child->item)
|
||||
{
|
||||
data->length = child->item->finfo->length;
|
||||
}
|
||||
data->offset = child->start_offset;
|
||||
data->length = child->length;
|
||||
node->data = data;
|
||||
}
|
||||
} else
|
||||
|
|
Loading…
Reference in New Issue