Skip to content

Commit b8ce8e3

Browse files
wangyumGitHub Enterprise
authored andcommitted
[CARMEL-7225] [CARMEL-3474] BuiltIn UDF java_method() is dangerous (apache#51)
1 parent e0b228c commit b8ce8e3

File tree

5 files changed

+21
-2
lines changed

5 files changed

+21
-2
lines changed

common/utils/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
<url>https://spark.apache.org/</url>
3333
<properties>
3434
<sbt.project.name>common-utils</sbt.project.name>
35-
<cluster>analytics</cluster> <!-- ETL/analytics -->
35+
<cluster></cluster> <!-- ETL/analytics -->
3636
</properties>
3737

3838
<dependencies>

core/src/main/scala/org/apache/spark/SparkConf.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,7 @@ class SparkConf(loadDefaults: Boolean) extends Cloneable with Logging with Seria
589589
private[spark] object SparkConf extends Logging {
590590

591591
private[spark] val isETLCluster = CLUSTER.toLowerCase(Locale.ROOT).equals("etl")
592+
private[spark] val isAnalyticsCluster = CLUSTER.toLowerCase(Locale.ROOT).equals("analytics")
592593

593594
/**
594595
* Maps deprecated config keys to information about the deprecation.

sql/api/src/main/scala/org/apache/spark/sql/catalyst/analysis/noSuchItemsExceptions.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,11 @@ class NoSuchFunctionException private(
198198
class NoSuchTempFunctionException(func: String)
199199
extends AnalysisException(errorClass = "ROUTINE_NOT_FOUND", Map("routineName" -> s"`$func`"))
200200

201+
class BannedFunctionException(func: String)
202+
extends AnalysisException(
203+
s"Banned function: function: '$func' is banned in Carmel SparkSQL to " +
204+
s"avoid potential risk, please contact Carmel support for more info.")
205+
201206
// any changes to this class should be backward compatible as it may be used by external connectors
202207
class NoSuchIndexException private(
203208
message: String,

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2059,6 +2059,12 @@ class Analyzer(override val catalogManager: CatalogManager) extends RuleExecutor
20592059
val externalFunctionNameSet = new mutable.HashSet[Seq[String]]()
20602060

20612061
plan.resolveExpressionsWithPruning(_.containsAnyPattern(UNRESOLVED_FUNCTION)) {
2062+
case f @ UnresolvedFunction(Seq(name), _, _, _, _)
2063+
if FunctionRegistry.bannedFunctionsForAnalytics
2064+
.contains(normalizeFuncName(f.nameParts).head) =>
2065+
withPosition(f) {
2066+
throw new BannedFunctionException(name)
2067+
}
20622068
case f @ UnresolvedFunction(nameParts, _, _, _, _) =>
20632069
if (ResolveFunctions.lookupBuiltinOrTempFunction(nameParts).isDefined) {
20642070
f

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/FunctionRegistry.scala

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import javax.annotation.concurrent.GuardedBy
2323
import scala.collection.mutable
2424
import scala.reflect.ClassTag
2525

26+
import org.apache.spark.SparkConf
2627
import org.apache.spark.internal.Logging
2728
import org.apache.spark.sql.AnalysisException
2829
import org.apache.spark.sql.catalyst.FunctionIdentifier
@@ -323,6 +324,12 @@ object FunctionRegistry {
323324

324325
val FUNC_ALIAS = TreeNodeTag[String]("functionAliasName")
325326

327+
private[catalyst] val bannedFunctionsForAnalytics = if (SparkConf.isAnalyticsCluster) {
328+
Seq("reflect", "java_method")
329+
} else {
330+
Seq.empty[String]
331+
}
332+
326333
// ==============================================================================================
327334
// The guideline for adding SQL functions
328335
// ==============================================================================================
@@ -829,7 +836,7 @@ object FunctionRegistry {
829836
expression[CsvToStructs]("from_csv"),
830837
expression[SchemaOfCsv]("schema_of_csv"),
831838
expression[StructsToCsv]("to_csv")
832-
)
839+
).filterNot { case (k, _) => bannedFunctionsForAnalytics.contains(k) }
833840

834841
val builtin: SimpleFunctionRegistry = {
835842
val fr = new SimpleFunctionRegistry

0 commit comments

Comments
 (0)