USB/PN532: Fix dissector to use new dissector *data instead of private_data. Bug...
authorMichael Mann <mmann78@netscape.net>
Thu, 31 Oct 2013 15:02:50 +0000 (15:02 -0000)
committerMichael Mann <mmann78@netscape.net>
Thu, 31 Oct 2013 15:02:50 +0000 (15:02 -0000)
From Michal Labedzki

svn path=/trunk/; revision=53003

epan/dissectors/packet-hci_usb.c
epan/dissectors/packet-usb-ccid.c
epan/dissectors/packet-usb.c

index 3f04ec0f980083b1e0605e442fec35532dd92836..86aef138c5b8459b9bb19b0708bc3fc5df1ce11e 100644 (file)
@@ -116,6 +116,7 @@ dissect_hci_usb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
 
 
     usb_data = (usb_data_t *)data;
+    DISSECTOR_ASSERT(usb_data);
 
     p2p_dir_save = pinfo->p2p_dir;
     pinfo->p2p_dir = usb_data->direction;
index 4098283cd51c606a1343f843eb7d9e4542e701e7..cf25932d2102c1bda984f992a6aa8fe683215b67 100644 (file)
@@ -341,13 +341,16 @@ dissect_usb_ccid_descriptor(tvbuff_t *tvb, packet_info *pinfo _U_,
 }
 
 
-static void
-dissect_ccid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+static gint
+dissect_ccid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
 {
     proto_item *item;
     proto_tree *ccid_tree;
     guint8      cmd;
     tvbuff_t   *next_tvb;
+    usb_data_t      *usb_data = (usb_data_t *) data;
+
+    DISSECTOR_ASSERT(usb_data);
 
     col_set_str(pinfo->cinfo, COL_PROTOCOL, "USBCCID");
     col_set_str(pinfo->cinfo, COL_INFO,     "CCID Packet");
@@ -442,7 +445,7 @@ dissect_ccid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                     if (tvb_get_guint8(tvb, 15) == 0xD4) {
 
                         /* Skip the 5 byte ACS Pseudo-Header */
-                        call_dissector(sub_handles[sub_selected], tvb_new_subset_remaining(tvb, 15), pinfo, tree);
+                        call_dissector_with_data(sub_handles[sub_selected], tvb_new_subset_remaining(tvb, 15), pinfo, tree, usb_data);
                     }
 
                     else {
@@ -493,7 +496,7 @@ dissect_ccid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 
                 /* Strip the ISO 7816 status word at the end, like we do in the PN532 dissector for FeliCa payloads... */
                 next_tvb= tvb_new_subset(tvb, 10, (tvb_get_guint8(tvb, 1) - 2), (tvb_get_guint8(tvb, 1) - 2));
-                call_dissector(sub_handles[SUB_PN532_ACS_PSEUDO_APDU], next_tvb, pinfo, tree);
+                call_dissector_with_data(sub_handles[SUB_PN532_ACS_PSEUDO_APDU], next_tvb, pinfo, tree, usb_data);
             }
 
             /* Try to dissect responses to GSM SIM packets */
@@ -521,6 +524,9 @@ dissect_ccid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
         proto_tree_add_item(ccid_tree, hf_ccid_bClockStatus, tvb, 9, 1, ENC_LITTLE_ENDIAN);
         break;
     }
+
+    /* TODO: Try use "offset" instead of hardcoded constants */
+    return tvb_length(tvb);
 }
 
 void
@@ -665,7 +671,7 @@ proto_register_ccid(void)
     ccid_dissector_table = register_dissector_table("usbccid.payload",
                                                     "USBCCID Payload", FT_UINT8, BASE_DEC);
 
-    register_dissector("usbccid", dissect_ccid, proto_ccid);
+    new_register_dissector("usbccid", dissect_ccid, proto_ccid);
 }
 
 /* Handler registration */
index 61af9871cf1812da2db0fb897af3162b5af7d470..d55289e84e5b42651dc5db89dd82b30e9bc412ba 100644 (file)
@@ -1122,7 +1122,8 @@ dissect_usb_setup_clear_feature_request(packet_info *pinfo _U_, proto_tree *tree
                                         tvbuff_t *tvb, int offset,
                                         usb_trans_info_t *usb_trans_info _U_,
                                         usb_conv_info_t  *usb_conv_info _U_,
-                                        guint bus_id _U_, guint device_address _U_)
+                                        guint bus_id _U_, guint device_address _U_,
+                                        usb_data_t *usb_data _U_)
 {
     /* feature selector */
     proto_tree_add_item(tree, hf_usb_wFeatureSelector, tvb, offset, 2, ENC_LITTLE_ENDIAN);
@@ -1145,7 +1146,8 @@ dissect_usb_setup_clear_feature_response(packet_info *pinfo _U_, proto_tree *tre
                                          tvbuff_t *tvb _U_, int offset,
                                          usb_trans_info_t *usb_trans_info _U_,
                                          usb_conv_info_t  *usb_conv_info _U_,
-                                         guint bus_id _U_, guint device_address _U_)
+                                         guint bus_id _U_, guint device_address _U_,
+                                         usb_data_t *usb_data _U_)
 {
     return offset;
 }
@@ -1163,7 +1165,8 @@ dissect_usb_setup_get_configuration_response(packet_info *pinfo _U_, proto_tree
                                              tvbuff_t *tvb _U_, int offset,
                                              usb_trans_info_t *usb_trans_info _U_,
                                              usb_conv_info_t  *usb_conv_info _U_,
-                                             guint bus_id _U_, guint device_address _U_)
+                                             guint bus_id _U_, guint device_address _U_,
+                                             usb_data_t *usb_data _U_)
 {
     proto_tree_add_item(tree, hf_usb_bConfigurationValue, tvb, offset, 1, ENC_LITTLE_ENDIAN);
     offset += 1;
@@ -1679,7 +1682,7 @@ dissect_usb_endpoint_descriptor(packet_info *pinfo, proto_tree *parent_tree,
             /* Create a new address structure that points to the same device
              * but the new endpoint.
              */
-            usb_addr.device = ((usb_address_t *)(pinfo->src.data))->device;
+            usb_addr.device = ((const usb_address_t *)(pinfo->src.data))->device;
             usb_addr.endpoint = htolel(endpoint);
             SET_ADDRESS(&tmp_addr, AT_USB, USB_ADDR_LEN, (char *)&usb_addr);
             conversation = get_usb_conversation(pinfo, &tmp_addr, &pinfo->dst, usb_addr.endpoint, pinfo->destport);
@@ -1690,7 +1693,7 @@ dissect_usb_endpoint_descriptor(packet_info *pinfo, proto_tree *parent_tree,
             /* Create a new address structure that points to the same device
              * but the new endpoint.
              */
-            usb_addr.device = ((usb_address_t *)(pinfo->dst.data))->device;
+            usb_addr.device = ((const usb_address_t *)(pinfo->dst.data))->device;
             usb_addr.endpoint = htolel(endpoint);
             SET_ADDRESS(&tmp_addr, AT_USB, USB_ADDR_LEN, (char *)&usb_addr);
             conversation = get_usb_conversation(pinfo, &pinfo->src, &tmp_addr, pinfo->srcport, usb_addr.endpoint);
@@ -1829,7 +1832,7 @@ static int
 dissect_usb_configuration_descriptor(packet_info *pinfo _U_, proto_tree *parent_tree,
                                      tvbuff_t *tvb, int offset,
                                      usb_trans_info_t *usb_trans_info,
-                                     usb_conv_info_t  *usb_conv_info)
+                                     usb_conv_info_t  *usb_conv_info, usb_data_t *usb_data)
 {
     proto_item *item       = NULL;
     proto_tree *tree       = NULL;
@@ -1935,7 +1938,7 @@ dissect_usb_configuration_descriptor(packet_info *pinfo _U_, proto_tree *parent_
             break;
         default:
             next_tvb = tvb_new_subset(tvb, offset, next_len, next_len);
-            if (dissector_try_uint(usb_descriptor_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, parent_tree)) {
+            if (dissector_try_uint_new(usb_descriptor_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, parent_tree, TRUE, usb_data)) {
                 offset += next_len;
             } else {
                 offset = dissect_usb_unknown_descriptor(pinfo, parent_tree, tvb, offset, usb_trans_info, usb_conv_info);
@@ -1970,7 +1973,8 @@ dissect_usb_setup_get_descriptor_request(packet_info *pinfo, proto_tree *tree,
                                          tvbuff_t *tvb, int offset,
                                          usb_trans_info_t *usb_trans_info,
                                          usb_conv_info_t  *usb_conv_info _U_,
-                                         guint bus_id _U_, guint device_address _U_)
+                                         guint bus_id _U_, guint device_address _U_,
+                                         usb_data_t *usb_data _U_)
 {
     /* descriptor index */
     proto_tree_add_item(tree, hf_usb_descriptor_index, tvb, offset, 1, ENC_LITTLE_ENDIAN);
@@ -2000,7 +2004,8 @@ dissect_usb_setup_get_descriptor_response(packet_info *pinfo, proto_tree *tree,
                                           tvbuff_t *tvb, int offset,
                                           usb_trans_info_t *usb_trans_info,
                                           usb_conv_info_t  *usb_conv_info,
-                                          guint bus_id, guint device_address)
+                                          guint bus_id, guint device_address,
+                                          usb_data_t *usb_data)
 {
 
     col_append_fstr(pinfo->cinfo, COL_INFO, " %s",
@@ -2011,7 +2016,7 @@ dissect_usb_setup_get_descriptor_response(packet_info *pinfo, proto_tree *tree,
         offset = dissect_usb_device_descriptor(pinfo, tree, tvb, offset, usb_trans_info, bus_id, device_address);
         break;
     case USB_DT_CONFIG:
-        offset = dissect_usb_configuration_descriptor(pinfo, tree, tvb, offset, usb_trans_info, usb_conv_info);
+        offset = dissect_usb_configuration_descriptor(pinfo, tree, tvb, offset, usb_trans_info, usb_conv_info, usb_data);
         break;
     case USB_DT_STRING:
         offset = dissect_usb_string_descriptor(pinfo, tree, tvb, offset, usb_trans_info, usb_conv_info);
@@ -2054,7 +2059,8 @@ dissect_usb_setup_get_interface_request(packet_info *pinfo _U_, proto_tree *tree
                                         tvbuff_t *tvb, int offset,
                                         usb_trans_info_t *usb_trans_info _U_,
                                         usb_conv_info_t  *usb_conv_info _U_,
-                                        guint bus_id _U_, guint device_address _U_)
+                                        guint bus_id _U_, guint device_address _U_,
+                                        usb_data_t *usb_data _U_)
 {
     /* zero */
     proto_tree_add_item(tree, hf_usb_value, tvb, offset, 2, ENC_LITTLE_ENDIAN);
@@ -2076,7 +2082,8 @@ dissect_usb_setup_get_interface_response(packet_info *pinfo _U_, proto_tree *tre
                                          tvbuff_t *tvb, int offset,
                                          usb_trans_info_t *usb_trans_info _U_,
                                          usb_conv_info_t  *usb_conv_info _U_,
-                                         guint bus_id _U_, guint device_address _U_)
+                                         guint bus_id _U_, guint device_address _U_,
+                                         usb_data_t *usb_data _U_)
 {
     /* alternate setting */
     proto_tree_add_item(tree, hf_usb_bAlternateSetting, tvb, offset, 1, ENC_LITTLE_ENDIAN);
@@ -2098,7 +2105,8 @@ dissect_usb_setup_get_status_request(packet_info *pinfo _U_, proto_tree *tree,
                                      tvbuff_t *tvb, int offset,
                                      usb_trans_info_t *usb_trans_info _U_,
                                      usb_conv_info_t  *usb_conv_info _U_,
-                                     guint bus_id _U_, guint device_address _U_)
+                                     guint bus_id _U_, guint device_address _U_,
+                                     usb_data_t *usb_data _U_)
 {
     /* zero */
     proto_tree_add_item(tree, hf_usb_value, tvb, offset, 2, ENC_LITTLE_ENDIAN);
@@ -2121,7 +2129,8 @@ dissect_usb_setup_get_status_response(packet_info *pinfo _U_, proto_tree *tree,
                                       tvbuff_t *tvb, int offset,
                                       usb_trans_info_t *usb_trans_info _U_,
                                       usb_conv_info_t  *usb_conv_info _U_,
-                                      guint bus_id _U_, guint device_address _U_)
+                                      guint bus_id _U_, guint device_address _U_,
+                                      usb_data_t *usb_data _U_)
 {
     /* status */
     /* XXX - show bits */
@@ -2144,7 +2153,8 @@ dissect_usb_setup_set_address_request(packet_info *pinfo _U_, proto_tree *tree,
                                       tvbuff_t *tvb, int offset,
                                       usb_trans_info_t *usb_trans_info _U_,
                                       usb_conv_info_t  *usb_conv_info _U_,
-                                      guint bus_id _U_, guint device_address _U_)
+                                      guint bus_id _U_, guint device_address _U_,
+                                      usb_data_t *usb_data _U_)
 {
     /* device address */
     proto_tree_add_item(tree, hf_usb_device_address, tvb, offset, 2, ENC_LITTLE_ENDIAN);
@@ -2166,7 +2176,8 @@ dissect_usb_setup_set_address_response(packet_info *pinfo _U_, proto_tree *tree
                                        tvbuff_t *tvb _U_, int offset,
                                        usb_trans_info_t *usb_trans_info _U_,
                                        usb_conv_info_t  *usb_conv_info _U_,
-                                       guint bus_id _U_, guint device_address _U_)
+                                       guint bus_id _U_, guint device_address _U_,
+                                       usb_data_t *usb_data _U_)
 {
     return offset;
 }
@@ -2184,7 +2195,8 @@ dissect_usb_setup_set_configuration_request(packet_info *pinfo _U_, proto_tree *
                                             tvbuff_t *tvb, int offset,
                                             usb_trans_info_t *usb_trans_info _U_,
                                             usb_conv_info_t  *usb_conv_info _U_,
-                                            guint bus_id _U_, guint device_address _U_)
+                                            guint bus_id _U_, guint device_address _U_,
+                                            usb_data_t *usb_data _U_)
 {
     /* configuration value */
     proto_tree_add_item(tree, hf_usb_bConfigurationValue, tvb, offset, 1, ENC_LITTLE_ENDIAN);
@@ -2206,7 +2218,8 @@ dissect_usb_setup_set_configuration_response(packet_info *pinfo _U_, proto_tree
                                              tvbuff_t *tvb _U_, int offset,
                                              usb_trans_info_t *usb_trans_info _U_,
                                              usb_conv_info_t  *usb_conv_info _U_,
-                                             guint bus_id _U_, guint device_address _U_)
+                                             guint bus_id _U_, guint device_address _U_,
+                                             usb_data_t *usb_data _U_)
 {
     return offset;
 }
@@ -2224,7 +2237,8 @@ dissect_usb_setup_set_feature_request(packet_info *pinfo _U_, proto_tree *tree,
                                       tvbuff_t *tvb, int offset,
                                       usb_trans_info_t *usb_trans_info _U_,
                                       usb_conv_info_t  *usb_conv_info _U_,
-                                      guint bus_id _U_, guint device_address _U_)
+                                      guint bus_id _U_, guint device_address _U_,
+                                      usb_data_t *usb_data _U_)
 {
     /* feature selector */
     proto_tree_add_item(tree, hf_usb_wFeatureSelector, tvb, offset, 2, ENC_LITTLE_ENDIAN);
@@ -2247,7 +2261,8 @@ dissect_usb_setup_set_feature_response(packet_info *pinfo _U_, proto_tree *tree
                                        tvbuff_t *tvb _U_, int offset,
                                        usb_trans_info_t *usb_trans_info _U_,
                                        usb_conv_info_t  *usb_conv_info _U_,
-                                       guint bus_id _U_, guint device_address _U_)
+                                       guint bus_id _U_, guint device_address _U_,
+                                       usb_data_t *usb_data _U_)
 {
     return offset;
 }
@@ -2265,7 +2280,8 @@ dissect_usb_setup_set_interface_request(packet_info *pinfo _U_, proto_tree *tree
                                         tvbuff_t *tvb, int offset,
                                         usb_trans_info_t *usb_trans_info _U_,
                                         usb_conv_info_t  *usb_conv_info _U_,
-                                        guint bus_id _U_, guint device_address _U_)
+                                        guint bus_id _U_, guint device_address _U_,
+                                        usb_data_t *usb_data _U_)
 {
     /* alternate setting */
     proto_tree_add_item(tree, hf_usb_bAlternateSetting, tvb, offset, 1, ENC_LITTLE_ENDIAN);
@@ -2287,7 +2303,8 @@ dissect_usb_setup_set_interface_response(packet_info *pinfo _U_, proto_tree *tre
                                          tvbuff_t *tvb _U_, int offset,
                                          usb_trans_info_t *usb_trans_info _U_,
                                          usb_conv_info_t  *usb_conv_info _U_,
-                                         guint bus_id _U_, guint device_address _U_)
+                                         guint bus_id _U_, guint device_address _U_,
+                                         usb_data_t *usb_data _U_)
 {
     return offset;
 }
@@ -2305,7 +2322,8 @@ dissect_usb_setup_synch_frame_request(packet_info *pinfo _U_, proto_tree *tree,
                                       tvbuff_t *tvb, int offset,
                                       usb_trans_info_t *usb_trans_info _U_,
                                       usb_conv_info_t  *usb_conv_info _U_,
-                                      guint bus_id _U_, guint device_address _U_)
+                                      guint bus_id _U_, guint device_address _U_,
+                                      usb_data_t *usb_data _U_)
 {
     /* zero */
     proto_tree_add_item(tree, hf_usb_value, tvb, offset, 2, ENC_LITTLE_ENDIAN);
@@ -2328,7 +2346,8 @@ dissect_usb_setup_synch_frame_response(packet_info *pinfo _U_, proto_tree *tree
                                        tvbuff_t *tvb _U_, int offset,
                                        usb_trans_info_t *usb_trans_info _U_,
                                        usb_conv_info_t  *usb_conv_info _U_,
-                                       guint bus_id _U_, guint device_address _U_)
+                                       guint bus_id _U_, guint device_address _U_,
+                                       usb_data_t *usb_data _U_)
 {
     /* frame number */
     proto_tree_add_item(tree, hf_usb_wFrameNumber, tvb, offset, 2, ENC_LITTLE_ENDIAN);
@@ -2342,7 +2361,8 @@ typedef int (*usb_setup_dissector)(packet_info *pinfo, proto_tree *tree,
                                    tvbuff_t *tvb, int offset,
                                    usb_trans_info_t *usb_trans_info,
                                    usb_conv_info_t  *usb_conv_info,
-                                   guint bus_id, guint device_address);
+                                   guint bus_id, guint device_address,
+                                   usb_data_t *usb_data);
 
 typedef struct _usb_setup_dissector_table_t {
     guint8 request;
@@ -2818,7 +2838,7 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent,
             if (try_heuristics && dissector_try_heuristic(heur_bulk_subdissector_list, next_tvb, pinfo, parent, NULL)) {
                 return;
             }
-            else if (dissector_try_uint(usb_bulk_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, parent)) {
+            else if (dissector_try_uint_new(usb_bulk_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, parent, TRUE, usb_data)) {
                 return;
             }
         }
@@ -2850,7 +2870,7 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent,
             if (try_heuristics && dissector_try_heuristic(heur_interrupt_subdissector_list, next_tvb, pinfo, parent, NULL)) {
                 return;
             }
-            else if (dissector_try_uint(usb_interrupt_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, parent)) {
+            else if (dissector_try_uint_new(usb_interrupt_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, parent, TRUE, usb_data)) {
                 return;
             }
         }
@@ -2911,7 +2931,7 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent,
 
                     if (dissector) {
                         offset = dissector(pinfo, setup_tree, tvb, offset, usb_trans_info,
-                                usb_conv_info, bus_id, device_address);
+                                usb_conv_info, bus_id, device_address, usb_data);
                     } else {
                         proto_tree_add_item(setup_tree, hf_usb_value, tvb, offset, 2, ENC_LITTLE_ENDIAN);
                         offset += 2;
@@ -2954,7 +2974,7 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent,
                     if (try_heuristics && dissector_try_heuristic(heur_control_subdissector_list, next_tvb, pinfo, setup_tree, NULL)) {
                         return;
                     }
-                    if (dissector_try_uint(usb_control_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, setup_tree)) {
+                    if (dissector_try_uint_new(usb_control_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, setup_tree, TRUE, usb_data)) {
                         return;
                     }
                     /* Else no class dissector, just display generic fields */
@@ -2999,7 +3019,7 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent,
                 if (try_heuristics && dissector_try_heuristic(heur_control_subdissector_list, next_tvb, pinfo, parent, NULL)) {
                     return;
                 }
-                if (dissector_try_uint(usb_control_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, parent)) {
+                if (dissector_try_uint_new(usb_control_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, parent, TRUE, usb_data)) {
                     return;
                 }
             }
@@ -3066,7 +3086,7 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent,
                 if (try_heuristics && dissector_try_heuristic(heur_control_subdissector_list, next_tvb, pinfo, parent, NULL)) {
                     return;
                 }
-                if (dissector_try_uint(usb_control_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, parent)) {
+                if (dissector_try_uint_new(usb_control_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, parent, TRUE, usb_data)) {
                     return;
                 }
 
@@ -3092,7 +3112,7 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent,
 
                     if (dissector) {
                         offset = dissector(pinfo, parent, tvb, offset, usb_conv_info->usb_trans_info,
-                                usb_conv_info, bus_id, device_address);
+                                usb_conv_info, bus_id, device_address, usb_data);
                     } else {
                         if (tvb_reported_length_remaining(tvb, offset) != 0) {
                             proto_tree_add_text(parent, tvb, offset, -1, "CONTROL response data");
@@ -3396,7 +3416,7 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent,
         if (device_protocol_data && device_protocol_data->bus_id == bus_id &&
                 device_protocol_data->device_address == device_address &&
                 dissector_try_uint_new(protocol_to_dissector, (guint32) device_protocol_data->protocol, next_tvb, pinfo, parent, FALSE, usb_data)) {
-            offset += tvb_length_remaining(tvb, offset);
+            offset += tvb_length(next_tvb);
         } else {
             device_product_data_t   *device_product_data;
 
@@ -3405,11 +3425,11 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent,
                     device_product_data->device_address == device_address &&
                     dissector_try_uint_new(product_to_dissector, (guint32) (device_product_data->vendor << 16 | device_product_data->product),
                                            next_tvb, pinfo, parent, FALSE, usb_data)) {
-                offset += tvb_length_remaining(tvb, offset);
+                offset += tvb_length(next_tvb);
             }
         }
     } else {
-        offset += tvb_length_remaining(tvb, offset);
+        offset += tvb_length(next_tvb);
     }
 
     if (tvb_reported_length_remaining(tvb, offset) != 0) {