nmap-0002: nmap.cc merge_port_lists O(N²) port dedup → unordered_set O(N); ~65000x at max range haproxy-0004: http_ana.c http_capture_headers O(H×C) cap_hdr walk per request → pre-built HashMap O(H) nginx-0004: ngx_http_upstream_keepalive_module.c keepalive_get_peer O(C) sockaddr scan per upstream request → HashMap O(1) weechat-0003: irc-channel.c irc_channel_search O(C) linked-list scan per message handler → channels_hashtable O(1) zeek-0002: Attr.cc Attributes::AddAttrs O(A²) triple-Find/RemoveAttr per attr → unordered_map index O(A) curl-0004: mime.c search_header O(P×H) 3x per part per mime_add_headers → pre-indexed header name set O(P)
48 lines
1.9 KiB
Diff
48 lines
1.9 KiB
Diff
--- a/subprojects/gstreamer/plugins/elements/gstinputselector.c
|
|
+++ b/subprojects/gstreamer/plugins/elements/gstinputselector.c
|
|
@@ -1806,7 +1806,8 @@ gst_input_selector_event (GstPad * pad, GstObject * parent, GstEvent * event)
|
|
gboolean result = FALSE;
|
|
GstIterator *iter;
|
|
gboolean done = FALSE;
|
|
GValue item = { 0, };
|
|
GstPad *eventpad;
|
|
- GList *pushed_pads = NULL;
|
|
+ /* CWE-407 fix: replace O(N) g_list_find seen-list with O(1) hash set */
|
|
+ GHashTable *pushed_pads_set = g_hash_table_new (g_direct_hash, g_direct_equal);
|
|
|
|
sel = GST_INPUT_SELECTOR (parent);
|
|
iter = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (sel));
|
|
@@ -1826,7 +1827,7 @@ gst_input_selector_event (GstPad * pad, GstObject * parent, GstEvent * event)
|
|
gst_event_ref (event);
|
|
result |= gst_pad_push_event (eventpad, event);
|
|
- pushed_pads = g_list_append (pushed_pads, eventpad);
|
|
+ g_hash_table_add (pushed_pads_set, eventpad);
|
|
gst_object_unref (eventpad);
|
|
} else {
|
|
GST_INPUT_SELECTOR_UNLOCK (sel);
|
|
@@ -1838,19 +1839,19 @@ gst_input_selector_event (GstPad * pad, GstObject * parent, GstEvent * event)
|
|
eventpad = g_value_get_object (&item);
|
|
|
|
- /* if already pushed, skip */
|
|
- if (g_list_find (pushed_pads, eventpad)) {
|
|
+ /* CWE-407 fix: O(1) hash lookup replaces O(N) g_list_find scan */
|
|
+ if (g_hash_table_contains (pushed_pads_set, eventpad)) {
|
|
g_value_reset (&item);
|
|
break;
|
|
}
|
|
|
|
gst_event_ref (event);
|
|
result |= gst_pad_push_event (eventpad, event);
|
|
- pushed_pads = g_list_append (pushed_pads, eventpad);
|
|
+ g_hash_table_add (pushed_pads_set, eventpad);
|
|
|
|
g_value_reset (&item);
|
|
break;
|
|
@@ -1870,7 +1871,7 @@ gst_input_selector_event (GstPad * pad, GstObject * parent, GstEvent * event)
|
|
g_value_unset (&item);
|
|
gst_iterator_free (iter);
|
|
- g_list_free (pushed_pads);
|
|
+ g_hash_table_destroy (pushed_pads_set);
|
|
|
|
gst_event_unref (event);
|
|
return result;
|