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:
parent
73d2989f37
commit
3d785236ae
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue