java-topology/defects/wireshark/patch/wireshark-0001.patch

57 lines
1.7 KiB
Diff

# UNDF: UNDF-2026-000000341
--- a/epan/dfilter/dfilter-int.h
+++ b/epan/dfilter/dfilter-int.h
@@ -1,5 +1,6 @@
#pragma once
#include <glib.h>
+#include <stdint.h>
struct epan_dfilter {
GPtrArray *insns;
@@ -18,8 +19,9 @@ struct epan_dfilter {
GSList *warnings;
/* Set of fields referenced by this filter */
- int *interesting_fields;
- int num_interesting_fields;
+ int *interesting_fields; /* kept for dfilter_prime_proto_tree iteration */
+ int num_interesting_fields;
+ GHashSet *interesting_fields_set; /* O(1) membership test */
};
--- a/epan/dfilter/dfilter.c
+++ b/epan/dfilter/dfilter.c
@@ -175,6 +175,9 @@ dfilter_free(dfilter_t *df)
if (df == NULL)
return;
+ if (df->interesting_fields_set)
+ g_hash_table_destroy(df->interesting_fields_set);
+
g_free(df->interesting_fields);
@@ -496,6 +499,19 @@ dfilter_compile_full(...)
dfilter->interesting_fields = dfw_interesting_fields(dfw,
&dfilter->num_interesting_fields);
+ /* Build O(1) set for dfilter_interested_in_field() lookups */
+ dfilter->interesting_fields_set = g_hash_table_new(g_direct_hash, g_direct_equal);
+ for (int _i = 0; _i < dfilter->num_interesting_fields; _i++) {
+ g_hash_table_add(dfilter->interesting_fields_set,
+ GINT_TO_POINTER(dfilter->interesting_fields[_i]));
+ }
+
@@ -735,13 +752,8 @@ dfilter_interested_in_field(const dfilter_t *df, int hfid)
- int i;
-
- for (i = 0; i < df->num_interesting_fields; i++) {
- if (df->interesting_fields[i] == hfid) {
- return true;
- }
- }
- return false;
+ if (df->interesting_fields_set)
+ return g_hash_table_contains(df->interesting_fields_set, GINT_TO_POINTER(hfid));
+ return false;
}