java-topology/defects/hive/patch/hive-0001-0002-genmrproccontext-seenops-hashset.patch

80 lines
3.4 KiB
Diff

# UNDF: UNDF-2026-000000791
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/GenMRProcContext.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/GenMRProcContext.java
--- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/GenMRProcContext.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/GenMRProcContext.java
@@ -21,6 +21,7 @@ import java.util.ArrayList;
+import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
+import java.util.Set;
@@ -138,8 +138,9 @@ public class GenMRProcContext implements NodeProcessorCtx {
- private
- HashMap<Task<?>, List<Operator<? extends OperatorDesc>>> taskToSeenOps;
+ // CWE-407 fix (hive-0001): List→Set so isSeenOp() is O(1) not O(n).
+ private
+ HashMap<Task<?>, Set<Operator<? extends OperatorDesc>>> taskToSeenOps;
- private List<FileSinkOperator> seenFileSinkOps;
+ // CWE-407 fix (hive-0002): List→Set so contains() in GenMRFileSink1 is O(1).
+ private Set<FileSinkOperator> seenFileSinkOps;
@@ -212,15 +212,15 @@ public class GenMRProcContext implements NodeProcessorCtx {
taskToSeenOps = new HashMap<Task<?>,
- List<Operator<? extends OperatorDesc>>>();
+ Set<Operator<? extends OperatorDesc>>>();
@@ -246,19 +246,19 @@ public class GenMRProcContext implements NodeProcessorCtx {
public boolean isSeenOp(Task task, Operator operator) {
- List<Operator<?extends OperatorDesc>> seenOps = taskToSeenOps.get(task);
+ Set<Operator<?extends OperatorDesc>> seenOps = taskToSeenOps.get(task);
return seenOps != null && seenOps.contains(operator);
}
public void addSeenOp(Task task, Operator operator) {
- List<Operator<?extends OperatorDesc>> seenOps = taskToSeenOps.get(task);
+ Set<Operator<?extends OperatorDesc>> seenOps = taskToSeenOps.get(task);
if (seenOps == null) {
- taskToSeenOps.put(task, seenOps = new ArrayList<Operator<? extends OperatorDesc>>());
+ taskToSeenOps.put(task, seenOps = new HashSet<Operator<? extends OperatorDesc>>());
}
seenOps.add(operator);
}
/**
* @return file operators already visited
*/
- public List<FileSinkOperator> getSeenFileSinkOps() {
+ public Set<FileSinkOperator> getSeenFileSinkOps() {
return seenFileSinkOps;
}
/**
- * @param seenFileSinkOps
+ * @param seenFileSinkOps set of file sink operators already visited
*/
- public void setSeenFileSinkOps(List<FileSinkOperator> seenFileSinkOps) {
+ public void setSeenFileSinkOps(Set<FileSinkOperator> seenFileSinkOps) {
this.seenFileSinkOps = seenFileSinkOps;
}
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/GenMRFileSink1.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/GenMRFileSink1.java
--- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/GenMRFileSink1.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/GenMRFileSink1.java
@@ -21,6 +21,7 @@ import java.util.ArrayList;
+import java.util.HashSet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.Stack;
@@ -183,9 +183,9 @@ public class GenMRFileSink1 implements SemanticNodeProcessor {
- List<FileSinkOperator> seenFSOps = ctx.getSeenFileSinkOps();
+ Set<FileSinkOperator> seenFSOps = ctx.getSeenFileSinkOps();
if (seenFSOps == null) {
- seenFSOps = new ArrayList<FileSinkOperator>();
+ seenFSOps = new HashSet<FileSinkOperator>();
}
if (!seenFSOps.contains(fsOp)) {
seenFSOps.add(fsOp);