57 lines
1.7 KiB
Diff
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;
|
|
}
|