aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--epan/dissectors/packet-u3v.c4
-rw-r--r--epan/dissectors/packet-usb-audio.c4
-rw-r--r--epan/dissectors/packet-usb-masstorage.c5
-rw-r--r--epan/dissectors/packet-usb-video.c4
-rw-r--r--epan/dissectors/packet-usb.h5
5 files changed, 20 insertions, 2 deletions
diff --git a/epan/dissectors/packet-u3v.c b/epan/dissectors/packet-u3v.c
index 3359766a74..8e1a979edd 100644
--- a/epan/dissectors/packet-u3v.c
+++ b/epan/dissectors/packet-u3v.c
@@ -1683,6 +1683,10 @@ dissect_u3v(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
if (!u3v_conv_info) {
u3v_conv_info = wmem_new0(wmem_file_scope(), u3v_conv_info_t);
usb_conv_info->class_data = u3v_conv_info;
+ usb_conv_info->class_data_type = USB_CONV_U3V;
+ } else if (usb_conv_info->class_data_type != USB_CONV_U3V) {
+ /* Don't dissect if another USB type is in the conversation */
+ return 0;
}
prefix = tvb_get_letohl(tvb, 0);
diff --git a/epan/dissectors/packet-usb-audio.c b/epan/dissectors/packet-usb-audio.c
index 90c8e74aa3..df6e9ef7df 100644
--- a/epan/dissectors/packet-usb-audio.c
+++ b/epan/dissectors/packet-usb-audio.c
@@ -435,8 +435,12 @@ dissect_ac_if_hdr_body(tvbuff_t *tvb, gint offset, packet_info *pinfo _U_,
if(!audio_conv_info) {
audio_conv_info = wmem_new(wmem_file_scope(), audio_conv_info_t);
usb_conv_info->class_data = audio_conv_info;
+ usb_conv_info->class_data_type = USB_CONV_AUDIO;
/* XXX - set reasonable default values for all components
that are not filled in by this function */
+ } else if (usb_conv_info->class_data_type != USB_CONV_AUDIO) {
+ /* Don't dissect if another USB type is in the conversation */
+ return 0;
}
audio_conv_info->ver_major = ver_major;
offset += 2;
diff --git a/epan/dissectors/packet-usb-masstorage.c b/epan/dissectors/packet-usb-masstorage.c
index 743775be72..919f7ef364 100644
--- a/epan/dissectors/packet-usb-masstorage.c
+++ b/epan/dissectors/packet-usb-masstorage.c
@@ -199,9 +199,12 @@ dissect_usb_ms_bulk(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
usb_ms_conv_info->itl=wmem_tree_new(wmem_file_scope());
usb_ms_conv_info->itlq=wmem_tree_new(wmem_file_scope());
usb_conv_info->class_data=usb_ms_conv_info;
+ usb_conv_info->class_data_type = USB_CONV_MASS_STORAGE;
+ } else if (usb_conv_info->class_data_type != USB_CONV_MASS_STORAGE) {
+ /* Don't dissect if another USB type is in the conversation */
+ return 0;
}
-
is_request=(pinfo->srcport==NO_ENDPOINT);
col_set_str(pinfo->cinfo, COL_PROTOCOL, "USBMS");
diff --git a/epan/dissectors/packet-usb-video.c b/epan/dissectors/packet-usb-video.c
index 0bc292000f..3bf08f6156 100644
--- a/epan/dissectors/packet-usb-video.c
+++ b/epan/dissectors/packet-usb-video.c
@@ -1035,6 +1035,10 @@ dissect_usb_video_control_interface_descriptor(proto_tree *parent_tree, tvbuff_t
video_conv_info = wmem_new(wmem_file_scope(), video_conv_info_t);
video_conv_info->entities = wmem_tree_new(wmem_file_scope());
usb_conv_info->class_data = video_conv_info;
+ usb_conv_info->class_data_type = USB_CONV_VIDEO;
+ } else if (usb_conv_info->class_data_type != USB_CONV_VIDEO) {
+ /* Stop dissection if another USB type is in the conversation */
+ return descriptor_len;
}
entity = (video_entity_t*) wmem_tree_lookup32(video_conv_info->entities, entity_id);
diff --git a/epan/dissectors/packet-usb.h b/epan/dissectors/packet-usb.h
index 20ecc80b04..261592db5d 100644
--- a/epan/dissectors/packet-usb.h
+++ b/epan/dissectors/packet-usb.h
@@ -90,6 +90,8 @@ typedef struct _usb_trans_info_t {
guint64 usb_id;
} usb_trans_info_t;
+enum usb_conv_class_data_type {USB_CONV_UNKNOWN = 0, USB_CONV_U3V, USB_CONV_AUDIO, USB_CONV_VIDEO, USB_CONV_MASS_STORAGE};
+
/* Conversation Structure
* there is one such structure for each device/endpoint conversation */
struct _usb_conv_info_t {
@@ -113,7 +115,8 @@ struct _usb_conv_info_t {
wmem_tree_t *transactions;
usb_trans_info_t *usb_trans_info; /* pointer to the current transaction */
- void *class_data; /* private class/id decode data */
+ void *class_data; /* private class/id decode data */
+ enum usb_conv_class_data_type class_data_type;
wmem_array_t *alt_settings;
};