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));
+ }
}