dissect_ndr_c_and_or_v_string => dissect_ndr_c_and_or_v_array_core twice
authorStefan Metzmacher <metze@samba.org>
Mon, 21 Mar 2022 15:50:09 +0000 (16:50 +0100)
committerStefan Metzmacher <metze@samba.org>
Thu, 3 Nov 2022 10:32:45 +0000 (11:32 +0100)
epan/dissectors/packet-dcerpc.c

index a436f340d1f4c785e296c29e7d093ad6f659261f..97f54ce998cee5ae630195e90b25d8a7741e56f3 100644 (file)
@@ -2722,30 +2722,33 @@ dissect_ndr_c_and_or_v_string(tvbuff_t *tvb, int offset, packet_info *pinfo,
         .add_subtree = add_subtree,
         .data = data,
     };
-    void *old_private_data = di->private_data;
+    dcerpc_info old_di = *di;
     header_field_info *hfinfo;
 
+    DISSECTOR_ASSERT(is_conformant || is_varying);
     /* Make sure this really is a string field. */
     hfinfo = proto_registrar_get_nth(hfindex);
     DISSECTOR_ASSERT_FIELD_TYPE(hfinfo, FT_STRING);
 
-    di->private_data = &state;
-    if (is_conformant && is_varying) {
-       offset = dissect_ndr_ucvarray_block(tvb, offset, pinfo,
-                                           tree, di, drep,
-                                           dcerpc_ndr_string_uarray_blk);
-    } else if (is_conformant) {
-       offset = dissect_ndr_ucarray_block(tvb, offset, pinfo,
-                                          tree, di, drep,
-                                          dcerpc_ndr_string_uarray_blk);
-    } else if (is_varying) {
-       offset = dissect_ndr_uvarray_block(tvb, offset, pinfo,
-                                          tree, di, drep,
-                                          dcerpc_ndr_string_uarray_blk);
-    } else {
-        ws_assert_not_reached();
+    if (di->conformant_run) {
+        return offset;
     }
-    di->private_data = old_private_data;
+
+    old_di = *di;
+    di->private_data = &state;
+    di->conformant_run = 1;
+    offset = dissect_ndr_c_and_or_v_array_core(tvb, offset, pinfo,
+                                               tree, di, drep,
+                                               is_conformant, is_varying,
+                                               NULL, /* fnct_bytes */
+                                               dcerpc_ndr_string_uarray_blk);
+    di->conformant_run = 0;
+    offset = dissect_ndr_c_and_or_v_array_core(tvb, offset, pinfo,
+                                               tree, di, drep,
+                                               is_conformant, is_varying,
+                                               NULL, /* fnct_bytes */
+                                               dcerpc_ndr_string_uarray_blk);
+    *di = old_di;
 
     return offset;
 }