From 156533febb1fcd535a30dabb75560086395a7b6c Mon Sep 17 00:00:00 2001
From: Alex Pott <alex.a.pott@googlemail.com>
Date: Tue, 28 Nov 2023 16:11:24 +0000
Subject: [PATCH] Issue #3404039 by Wim Leers: PluginExistsConstraintValidator
 should return early if given NULL

---
 .../Constraint/PluginExistsConstraintValidator.php           | 4 ++++
 .../Core/Plugin/PluginExistsConstraintValidatorTest.php      | 5 +++++
 2 files changed, 9 insertions(+)

diff --git a/core/lib/Drupal/Core/Plugin/Plugin/Validation/Constraint/PluginExistsConstraintValidator.php b/core/lib/Drupal/Core/Plugin/Plugin/Validation/Constraint/PluginExistsConstraintValidator.php
index 2e9a8c33ae0b..b862bc339dfe 100644
--- a/core/lib/Drupal/Core/Plugin/Plugin/Validation/Constraint/PluginExistsConstraintValidator.php
+++ b/core/lib/Drupal/Core/Plugin/Plugin/Validation/Constraint/PluginExistsConstraintValidator.php
@@ -20,6 +20,10 @@ class PluginExistsConstraintValidator extends ConstraintValidator {
   public function validate(mixed $plugin_id, Constraint $constraint) {
     assert($constraint instanceof PluginExistsConstraint);
 
+    if ($plugin_id === NULL) {
+      return;
+    }
+
     $definition = $constraint->pluginManager->getDefinition($plugin_id, FALSE);
     // Some plugin managers provide fallbacks.
     if ($constraint->pluginManager instanceof FallbackPluginManagerInterface) {
diff --git a/core/tests/Drupal/KernelTests/Core/Plugin/PluginExistsConstraintValidatorTest.php b/core/tests/Drupal/KernelTests/Core/Plugin/PluginExistsConstraintValidatorTest.php
index 6c34c8f03380..3106db326968 100644
--- a/core/tests/Drupal/KernelTests/Core/Plugin/PluginExistsConstraintValidatorTest.php
+++ b/core/tests/Drupal/KernelTests/Core/Plugin/PluginExistsConstraintValidatorTest.php
@@ -61,6 +61,11 @@ public function testValidation(): void {
     $violations = $data->validate();
     $this->assertCount(1, $violations);
     $this->assertSame("The 'action_test_save_entity' plugin must implement or extend " . MenuInterface::class . '.', (string) $violations->get(0)->getMessage());
+
+    // No validation is attempted on a NULL value.
+    $data->setValue(NULL);
+    $violations = $data->validate();
+    $this->assertCount(0, $violations);
   }
 
 }
-- 
GitLab