java-topology/defects/clickhouse/patch/0001.patch
russell@unturf.com 9934133dcf whitepaper: 312 sites / 151 ecosystems — wave2+3 defect tables and PDF rebuild
Add 88 new defect entries to HIGH and MEDIUM tables:
  HIGH: mysql-0001/0002, mariadb-0001, redis-0001/0002, valkey-0001/0002, openvpn-0001,
        vlc-0001, prometheus-0001, otel-collector-0001, cockroachdb-0001..0004,
        tidb-0001..0008, kubernetes-0001/0002, go-0001, kotlin-0002, scala-0001,
        allegro5-0001, sdl2-0001, grafana-0001, clickhouse-0001, duckdb-0001,
        mongodb-0001, envoy-0001, istio-0001, cilium-0001, linkerd2-0001,
        linux-0001/0002/0003, tor-0002/0003, curl-0001, julia-0001, lua-0001,
        perl5-0001, nats-0001, spring-0003/0004, tomcat-0001, onos-0002, odl-0002

  MEDIUM: helm-0001, mariadb-0002, openssl-0001/0002, memcached-0001,
          cassandra-0001..0004, flink-0001, storm-0001/0002, zookeeper-0001..0003,
          pip-0001, gradle-0001, nginx-0001, haproxy-0001, caddy-0001, varnish-0001,
          ffmpeg-0001, gstreamer-0001, raylib-0001, love2d-0001, php-0001/0002,
          r-source-0001, cpython-0002, ruby-0001, rabbitmq-0003/0004, activemq-0001,
          ovs-0001, onos-0003, odl-0002, jetty-0001

PDF: 976K
2026-03-27 15:23:43 -04:00

63 lines
2.8 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

diff --git a/src/Analyzer/ColumnTransformers.cpp b/src/Analyzer/ColumnTransformers.cpp
index d5484e6c..5632ba67 100644
--- a/src/Analyzer/ColumnTransformers.cpp
+++ b/src/Analyzer/ColumnTransformers.cpp
@@ -264,20 +264,23 @@ ReplaceColumnTransformerNode::ReplaceColumnTransformerNode(const std::vector<Rep
"Expressions in column transformer replace should not contain same replacement {} more than once",
replacement.column_name);
+ size_t new_index = replacements_names.size();
replacements_names.push_back(replacement.column_name);
+ replacements_index.emplace(replacement.column_name, new_index);
replacement_expressions_nodes.push_back(replacement.expression_node);
}
}
QueryTreeNodePtr ReplaceColumnTransformerNode::findReplacementExpression(const std::string & expression_name)
{
- auto it = std::find(replacements_names.begin(), replacements_names.end(), expression_name);
- if (it == replacements_names.end())
+ // CWE-407 fix: O(1) hash-map lookup replaces O(n) std::find scan over replacements_names.
+ // Called inside a O(columns × transformers) nested loop in QueryAnalyzer::resolveColumnsTransformers().
+ auto idx_it = replacements_index.find(expression_name);
+ if (idx_it == replacements_index.end())
return {};
- size_t replacement_index = it - replacements_names.begin();
auto & replacement_expressions_nodes = getReplacements().getNodes();
- return replacement_expressions_nodes[replacement_index];
+ return replacement_expressions_nodes[idx_it->second];
}
void ReplaceColumnTransformerNode::dumpTreeImpl(WriteBuffer & buffer, FormatState & format_state, size_t indent) const
@@ -329,6 +332,7 @@ QueryTreeNodePtr ReplaceColumnTransformerNode::cloneImpl() const
result_replace_transformer->is_strict = is_strict;
result_replace_transformer->replacements_names = replacements_names;
+ result_replace_transformer->replacements_index = replacements_index;
return result_replace_transformer;
}
diff --git a/src/Analyzer/ColumnTransformers.h b/src/Analyzer/ColumnTransformers.h
index 406f8ddd..68d37970 100644
--- a/src/Analyzer/ColumnTransformers.h
+++ b/src/Analyzer/ColumnTransformers.h
@@ -3,6 +3,7 @@
#include <Analyzer/IQueryTreeNode.h>
#include <Analyzer/ListNode.h>
#include <Core/Names.h>
+#include <unordered_map>
namespace re2
{
@@ -304,6 +305,10 @@ private:
}
Names replacements_names;
+ // CWE-407 fix: shadow map for O(1) name→index lookup in findReplacementExpression(),
+ // replacing the O(n) std::find scan over replacements_names that was called in the
+ // O(columns × transformers) nested loop in QueryAnalyzer::resolveColumnsTransformers().
+ std::unordered_map<std::string, size_t> replacements_index;
bool is_strict = false;
static constexpr size_t replacements_child_index = 0;