80 lines
3.4 KiB
Diff
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);
|