This is an automated email from the ASF dual-hosted git repository.

jmclean pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/main by this push:
     new 326e0eb73c [#10277] fix(core): validate privilege array lengths in 
POConverters.fromSecurableObjectPO (#10292)
326e0eb73c is described below

commit 326e0eb73c92ed9fcd6ea1da8f538a024a03ed10
Author: Alex Schönbeck <[email protected]>
AuthorDate: Wed Apr 8 06:43:37 2026 +0200

    [#10277] fix(core): validate privilege array lengths in 
POConverters.fromSecurableObjectPO (#10292)
    
    Added input validation in POConverters.fromSecurableObjectPO to check
    that privilegeNames and privilegeConditions are non-null and have equal
    sizes before iterating, failing fast with a clear
    IllegalArgumentException instead of a cryptic IndexOutOfBoundsException.
    
    Fixes #10277
    
    Testing: Added testFromSecurableObjectPOWithMismatchedPrivileges in
    TestPOConverters which verifies the exception is thrown when privilege
    arrays are mismatched.
---
 .../storage/relational/utils/POConverters.java     |  6 ++++++
 .../storage/relational/utils/TestPOConverters.java | 22 ++++++++++++++++++++++
 2 files changed, 28 insertions(+)

diff --git 
a/core/src/main/java/org/apache/gravitino/storage/relational/utils/POConverters.java
 
b/core/src/main/java/org/apache/gravitino/storage/relational/utils/POConverters.java
index 71ce8b42a2..40cd0301e6 100644
--- 
a/core/src/main/java/org/apache/gravitino/storage/relational/utils/POConverters.java
+++ 
b/core/src/main/java/org/apache/gravitino/storage/relational/utils/POConverters.java
@@ -20,6 +20,7 @@
 package org.apache.gravitino.storage.relational.utils;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import java.time.Instant;
@@ -1305,6 +1306,11 @@ public class POConverters {
               .readValue(securableObjectPO.getPrivilegeConditions(), 
List.class);
 
       List<Privilege> privileges = Lists.newArrayList();
+      Preconditions.checkArgument(
+          privilegeNames.size() == privilegeConditions.size(),
+          "Privilege names and conditions must have the same size, but got %s 
names and %s conditions",
+          privilegeNames.size(),
+          privilegeConditions.size());
       for (int index = 0; index < privilegeNames.size(); index++) {
         if 
(Privilege.Condition.ALLOW.name().equals(privilegeConditions.get(index))) {
           privileges.add(Privileges.allow(privilegeNames.get(index)));
diff --git 
a/core/src/test/java/org/apache/gravitino/storage/relational/utils/TestPOConverters.java
 
b/core/src/test/java/org/apache/gravitino/storage/relational/utils/TestPOConverters.java
index 87da71493f..93e0de7fd1 100644
--- 
a/core/src/test/java/org/apache/gravitino/storage/relational/utils/TestPOConverters.java
+++ 
b/core/src/test/java/org/apache/gravitino/storage/relational/utils/TestPOConverters.java
@@ -87,6 +87,7 @@ import org.apache.gravitino.storage.relational.po.OwnerRelPO;
 import org.apache.gravitino.storage.relational.po.PolicyPO;
 import org.apache.gravitino.storage.relational.po.PolicyVersionPO;
 import org.apache.gravitino.storage.relational.po.SchemaPO;
+import org.apache.gravitino.storage.relational.po.SecurableObjectPO;
 import org.apache.gravitino.storage.relational.po.StatisticPO;
 import org.apache.gravitino.storage.relational.po.TablePO;
 import org.apache.gravitino.storage.relational.po.TagMetadataObjectRelPO;
@@ -1737,4 +1738,25 @@ public class TestPOConverters {
         .withAuditInfo(auditInfo)
         .build();
   }
+
+  @Test
+  public void testFromSecurableObjectPOWithNullPrivileges() {
+    SecurableObjectPO securableObjectPO =
+        SecurableObjectPO.builder()
+            .withRoleId(1L)
+            .withMetadataObjectId(1L)
+            .withType(MetadataObject.Type.CATALOG.name())
+            .withPrivilegeNames("null")
+            .withPrivilegeConditions("[\"ALLOW\"]")
+            .withCurrentVersion(1L)
+            .withLastVersion(1L)
+            .withDeletedAt(0L)
+            .build();
+
+    Assertions.assertThrows(
+        RuntimeException.class,
+        () ->
+            POConverters.fromSecurableObjectPO(
+                "test_catalog", securableObjectPO, 
MetadataObject.Type.CATALOG));
+  }
 }

Reply via email to