This is an automated email from the ASF dual-hosted git repository. yangjie01 pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/spark.git
The following commit(s) were added to refs/heads/master by this push: new 7d8d018e7bdc [SPARK-52381][CORE] JsonProtocol: Only accept subclasses of SparkListenerEvent 7d8d018e7bdc is described below commit 7d8d018e7bdcd03b9c730e45caeec98f13963dbb Author: PJ Fanning <pjfann...@users.noreply.github.com> AuthorDate: Sat Jun 28 19:04:10 2025 +0800 [SPARK-52381][CORE] JsonProtocol: Only accept subclasses of SparkListenerEvent ### What changes were proposed in this pull request? JsonProtocol tidy up. Only parse JSON relating to Spark events. https://issues.apache.org/jira/browse/SPARK-52381 ### Why are the changes needed? Tidier code and https://lists.apache.org/thread/9zwkdo85wcdfppgqvbhjly8wdgf595yp ### Does this PR introduce _any_ user-facing change? No ### How was this patch tested? Unit test ### Was this patch authored or co-authored using generative AI tooling? No Closes #51061 from pjfanning/SPARK-52381. Authored-by: PJ Fanning <pjfann...@users.noreply.github.com> Signed-off-by: yangjie01 <yangji...@baidu.com> --- .../scala/org/apache/spark/util/JsonProtocol.scala | 10 ++++++-- .../org/apache/spark/util/JsonProtocolSuite.scala | 30 ++++++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/core/src/main/scala/org/apache/spark/util/JsonProtocol.scala b/core/src/main/scala/org/apache/spark/util/JsonProtocol.scala index d4b9b3c2ef3a..201e5abb1bbc 100644 --- a/core/src/main/scala/org/apache/spark/util/JsonProtocol.scala +++ b/core/src/main/scala/org/apache/spark/util/JsonProtocol.scala @@ -919,8 +919,14 @@ private[spark] class JsonProtocol(sparkConf: SparkConf) extends JsonUtils { case `stageExecutorMetrics` => stageExecutorMetricsFromJson(json) case `blockUpdate` => blockUpdateFromJson(json) case `resourceProfileAdded` => resourceProfileAddedFromJson(json) - case other => mapper.readValue(json.toString, Utils.classForName(other)) - .asInstanceOf[SparkListenerEvent] + case other => + val otherClass = Utils.classForName(other) + if (classOf[SparkListenerEvent].isAssignableFrom(otherClass)) { + mapper.readValue(json.toString, otherClass) + .asInstanceOf[SparkListenerEvent] + } else { + throw new SparkException(s"Unknown event type: $other") + } } } diff --git a/core/src/test/scala/org/apache/spark/util/JsonProtocolSuite.scala b/core/src/test/scala/org/apache/spark/util/JsonProtocolSuite.scala index 115d1f34bcb4..390d22938802 100644 --- a/core/src/test/scala/org/apache/spark/util/JsonProtocolSuite.scala +++ b/core/src/test/scala/org/apache/spark/util/JsonProtocolSuite.scala @@ -1022,6 +1022,36 @@ class jsonProtocolSuite extends SparkFunSuite { "String value length (10000) exceeds the maximum allowed" )) } + + test("SPARK-52381: handle class not found") { + val unknownJson = + """{ + | "Event" : "com.example.UnknownEvent", + | "foo" : "foo" + |}""".stripMargin + try { + jsonProtocol.sparkEventFromJson(unknownJson) + fail("Expected ClassNotFoundException for unknown event type") + } catch { + case e: ClassNotFoundException => + } + } + + test("SPARK-52381: only read classes that extend SparkListenerEvent") { + val unknownJson = + """{ + | "Event" : "org.apache.spark.SparkException", + | "foo" : "foo" + |}""".stripMargin + try { + jsonProtocol.sparkEventFromJson(unknownJson) + fail("Expected SparkException for unknown event type") + } catch { + case e: SparkException => + assert(e.getMessage.startsWith("Unknown event type")) + } + } + } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@spark.apache.org For additional commands, e-mail: commits-h...@spark.apache.org