diff options
author | Chris Maynard <Christopher.Maynard@GTECH.COM> | 2013-12-10 22:04:00 +0000 |
---|---|---|
committer | Chris Maynard <Christopher.Maynard@GTECH.COM> | 2013-12-10 22:04:00 +0000 |
commit | 90f5deac446c805a071d61271ad616aadcfbb2ef (patch) | |
tree | 078b4e3640c46e9b0c96e87dd0e5355935c8d1a7 /epan/dissectors/packet-usb-video.c | |
parent | a57b528c870fa4b5d41ac750b24ebba8a4650305 (diff) |
Where appropriate, reject the packet entirely or at least protect against data being NULL.
svn path=/trunk/; revision=53923
Diffstat (limited to 'epan/dissectors/packet-usb-video.c')
-rw-r--r-- | epan/dissectors/packet-usb-video.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/epan/dissectors/packet-usb-video.c b/epan/dissectors/packet-usb-video.c index 6480f4c0c8..fcbfe3f83d 100644 --- a/epan/dissectors/packet-usb-video.c +++ b/epan/dissectors/packet-usb-video.c @@ -1490,13 +1490,13 @@ dissect_usb_vid_descriptor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, } else if (descriptor_type == CS_INTERFACE) { - if (usb_conv_info->interfaceSubclass == SC_VIDEOCONTROL) + if (usb_conv_info && usb_conv_info->interfaceSubclass == SC_VIDEOCONTROL) { offset = dissect_usb_video_control_interface_descriptor(tree, desc_tvb, descriptor_len, pinfo, usb_conv_info); } - else if (usb_conv_info->interfaceSubclass == SC_VIDEOSTREAMING) + else if (usb_conv_info && usb_conv_info->interfaceSubclass == SC_VIDEOSTREAMING) { offset = dissect_usb_video_streaming_interface_descriptor(tree, desc_tvb, descriptor_len); @@ -1602,6 +1602,9 @@ get_control_selector_values(guint8 entity_id, usb_conv_info_t *usb_conv_info) video_entity_t *entity = NULL; const value_string_ext *selectors = NULL; + if (usb_conv_info == NULL) + return NULL; + video_conv_info = (video_conv_info_t *)usb_conv_info->class_data; if (video_conv_info) entity = (video_entity_t*) wmem_tree_lookup32(video_conv_info->entities, entity_id); @@ -1994,12 +1997,18 @@ static int dissect_usb_vid_control(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { gboolean is_request = (pinfo->srcport == NO_ENDPOINT); - usb_conv_info_t *usb_conv_info = (usb_conv_info_t *)data; - usb_trans_info_t *usb_trans_info = usb_conv_info->usb_trans_info; + usb_conv_info_t *usb_conv_info; + usb_trans_info_t *usb_trans_info; int offset = 0; usb_setup_dissector dissector = NULL; const usb_setup_dissector_table_t *tmp; + /* Reject the packet if data or usb_trans_info are NULL */ + if (data == NULL || ((usb_conv_info_t *)data)->usb_trans_info == NULL) + return 0; + usb_conv_info = (usb_conv_info_t *)data; + usb_trans_info = usb_conv_info->usb_trans_info; + /* See if we can find a class specific dissector for this request */ for (tmp=setup_dissectors; tmp->dissector; tmp++) { |