USBLL: Set usbll_data_ptr to NULL on capture file close

As usbll_data_ptr is static variable, it was left pointing to
last dissected packet details. The details were freed when
capture file was closed.

Prevent crash if first packet is Handshake packet and
prev pointer is NULL.

Change-Id: I03eef3afbfa679349fb2e9ce6d90c5f56b9515a0
Signed-off-by: Ameya Deshpande <ameya.181co205@nitk.edu.in>
Reviewed-on: https://code.wireshark.org/review/36860
Petri-Dish: Tomasz Moń <desowin@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: Tomasz Moń <desowin@gmail.com>
This commit is contained in:
Ameya Deshpande 2020-04-17 00:05:23 +05:30 committed by Tomasz Moń
parent 73d2989f37
commit 3d785236ae
1 changed files with 44 additions and 39 deletions

View File

@ -423,49 +423,47 @@ dissect_usbll_split(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint of
static gint
dissect_usbll_handshake(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
{
if (usbll_data_ptr->prev) {
if (usbll_data_ptr->prev->prev &&
usbll_data_ptr->prev->prev->prev &&
usbll_data_ptr->prev->prev->prev->pid == USB_PID_SPECIAL_SPLIT &&
!usbll_data_ptr->prev->prev->prev->is_split_complete)
usbll_set_address(tree, tvb, pinfo, usbll_data_ptr->prev->prev->prev->dst.device,
usbll_data_ptr->prev->prev->prev->dst.endpoint,
USBLL_ADDRESS_DEV_TO_HOST | USBLL_ADDRESS_HUB_PORT,
&usbll_data_ptr->src, &usbll_data_ptr->dst);
if (usbll_data_ptr->prev &&
usbll_data_ptr->prev->prev &&
usbll_data_ptr->prev->prev->prev &&
usbll_data_ptr->prev->prev->prev->pid == USB_PID_SPECIAL_SPLIT &&
!usbll_data_ptr->prev->prev->prev->is_split_complete)
usbll_set_address(tree, tvb, pinfo, usbll_data_ptr->prev->prev->prev->dst.device,
usbll_data_ptr->prev->prev->prev->dst.endpoint,
USBLL_ADDRESS_DEV_TO_HOST | USBLL_ADDRESS_HUB_PORT,
&usbll_data_ptr->src, &usbll_data_ptr->dst);
else if (usbll_data_ptr->prev->prev &&
usbll_data_ptr->prev->prev->pid == USB_PID_SPECIAL_SPLIT &&
!usbll_data_ptr->prev->prev->is_split_complete)
usbll_set_address(tree, tvb, pinfo, usbll_data_ptr->prev->prev->dst.device,
usbll_data_ptr->prev->prev->dst.endpoint,
USBLL_ADDRESS_DEV_TO_HOST | USBLL_ADDRESS_HUB_PORT,
&usbll_data_ptr->src, &usbll_data_ptr->dst);
else if (usbll_data_ptr->prev &&
usbll_data_ptr->prev->prev &&
usbll_data_ptr->prev->prev->pid == USB_PID_SPECIAL_SPLIT &&
!usbll_data_ptr->prev->prev->is_split_complete)
usbll_set_address(tree, tvb, pinfo, usbll_data_ptr->prev->prev->dst.device,
usbll_data_ptr->prev->prev->dst.endpoint,
USBLL_ADDRESS_DEV_TO_HOST | USBLL_ADDRESS_HUB_PORT,
&usbll_data_ptr->src, &usbll_data_ptr->dst);
else if (usbll_data_ptr->prev->prev &&
usbll_data_ptr->prev->prev->pid == USB_PID_SPECIAL_SPLIT &&
usbll_data_ptr->prev->prev->is_split_complete &&
usbll_data_ptr->pid == USB_PID_HANDSHAKE_NYET)
usbll_set_address(tree, tvb, pinfo, usbll_data_ptr->prev->prev->dst.device,
usbll_data_ptr->prev->prev->dst.endpoint,
USBLL_ADDRESS_DEV_TO_HOST | USBLL_ADDRESS_HUB_PORT,
&usbll_data_ptr->src, &usbll_data_ptr->dst);
else if (usbll_data_ptr->prev &&
usbll_data_ptr->prev->prev &&
usbll_data_ptr->prev->prev->pid == USB_PID_SPECIAL_SPLIT &&
usbll_data_ptr->prev->prev->is_split_complete &&
usbll_data_ptr->pid == USB_PID_HANDSHAKE_NYET)
usbll_set_address(tree, tvb, pinfo, usbll_data_ptr->prev->prev->dst.device,
usbll_data_ptr->prev->prev->dst.endpoint,
USBLL_ADDRESS_DEV_TO_HOST | USBLL_ADDRESS_HUB_PORT,
&usbll_data_ptr->src, &usbll_data_ptr->dst);
else if (usbll_data_ptr->prev->dst.flags & USBLL_ADDRESS_HOST)
usbll_set_address(tree, tvb, pinfo,
usbll_data_ptr->prev->src.device,
usbll_data_ptr->prev->src.endpoint,
USBLL_ADDRESS_HOST_TO_DEV,
&usbll_data_ptr->src, &usbll_data_ptr->dst);
else if (usbll_data_ptr->prev->dst.flags & USBLL_ADDRESS_HOST)
usbll_set_address(tree, tvb, pinfo,
usbll_data_ptr->prev->src.device,
usbll_data_ptr->prev->src.endpoint,
USBLL_ADDRESS_HOST_TO_DEV,
&usbll_data_ptr->src, &usbll_data_ptr->dst);
else
usbll_set_address(tree, tvb, pinfo,
usbll_data_ptr->prev->dst.device,
usbll_data_ptr->prev->dst.endpoint,
USBLL_ADDRESS_DEV_TO_HOST,
&usbll_data_ptr->src, &usbll_data_ptr->dst);
else
usbll_set_address(tree, tvb, pinfo,
usbll_data_ptr->prev->dst.device,
usbll_data_ptr->prev->dst.endpoint,
USBLL_ADDRESS_DEV_TO_HOST,
&usbll_data_ptr->src, &usbll_data_ptr->dst);
}
return offset;
}
@ -492,6 +490,12 @@ usbll_create_data(packet_info *pinfo, guint32 pid)
return n_data_ptr;
}
static void
usbll_cleanup_data(void)
{
usbll_data_ptr = NULL;
}
static int
dissect_usbll_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void* data _U_)
{
@ -680,6 +684,7 @@ proto_register_usbll(void)
expert_register_field_array(expert_module, ei, array_length(ei));
register_dissector("usbll", dissect_usbll_packet, proto_usbll);
register_cleanup_routine(usbll_cleanup_data);
usbll_address_type = address_type_dissector_register("AT_USBLL", "USBLL Address",
usbll_addr_to_str, usbll_addr_str_len,