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:
Stig Bjørlykke 2016-08-25 15:39:40 +02:00 committed by Alexis La Goutte
parent f597234785
commit ce9a4b212e
3 changed files with 11 additions and 14 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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