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
63 lines
2.8 KiB
Diff
63 lines
2.8 KiB
Diff
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;
|