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

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

commit 55386c546f030c19338f708bff68b211e04713e4
Author: Nathan Bossart <[email protected]>
AuthorDate: Mon May 11 05:13:50 2026 -0700

    Check CREATE privilege on multirange type schema in CREATE TYPE.
    
    This omission allowed roles to create multirange types in any
    schema, potentially leading to privilege escalations.  Note that
    when a multirange type name is not specified in CREATE TYPE, it is
    automatically placed in the range type's schema, which is checked
    at the beginning of DefineRange().
    
    Reported-by: Jelte Fennema-Nio <[email protected]>
    Author: Jelte Fennema-Nio <[email protected]>
    Reviewed-by: Nathan Bossart <[email protected]>
    Reviewed-by: Tomas Vondra <[email protected]>
    Security: CVE-2026-6472
    Backpatch-through: 14
---
 src/backend/commands/typecmds.c               |  7 +++++++
 src/test/regress/expected/multirangetypes.out | 16 ++++++++++++++++
 src/test/regress/sql/multirangetypes.sql      | 16 ++++++++++++++++
 3 files changed, 39 insertions(+)

diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index eca779fc0c4..5b3a11519cf 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -1555,6 +1555,13 @@ DefineRange(ParseState *pstate, CreateRangeStmt *stmt)
                        /* we can look up the subtype name immediately */
                        multirangeNamespace = 
QualifiedNameGetCreationNamespace(defGetQualifiedName(defel),
                                                                                
                                                        &multirangeTypeName);
+
+                       /* Check we have creation rights in target namespace */
+                       aclresult = object_aclcheck(NamespaceRelationId, 
multirangeNamespace,
+                                                                               
GetUserId(), ACL_CREATE);
+                       if (aclresult != ACLCHECK_OK)
+                               aclcheck_error(aclresult, OBJECT_SCHEMA,
+                                                          
get_namespace_name(multirangeNamespace));
                }
                else
                        ereport(ERROR,
diff --git a/src/test/regress/expected/multirangetypes.out 
b/src/test/regress/expected/multirangetypes.out
index 41f8cc146e7..3661e696ff1 100644
--- a/src/test/regress/expected/multirangetypes.out
+++ b/src/test/regress/expected/multirangetypes.out
@@ -3115,6 +3115,22 @@ select _textrange1(textrange2('a','z')) @> 'b'::text;
 drop type textrange1;
 drop type textrange2;
 --
+-- CREATE TYPE checks for CREATE on multirange schema
+--
+create role regress_mr;
+create schema mr_sch;
+set role regress_mr;
+create type mytype as range (subtype=int4, 
multirange_type_name=mr_sch.mr_type);
+ERROR:  permission denied for schema mr_sch
+reset role;
+grant create on schema mr_sch to regress_mr;
+set role regress_mr;
+create type mytype as range (subtype=int4, 
multirange_type_name=mr_sch.mr_type);
+reset role;
+drop type mytype;
+drop schema mr_sch;
+drop role regress_mr;
+--
 -- Test polymorphic type system
 --
 create function anyarray_anymultirange_func(a anyarray, r anymultirange)
diff --git a/src/test/regress/sql/multirangetypes.sql 
b/src/test/regress/sql/multirangetypes.sql
index b9c1431c306..d9d7c83310f 100644
--- a/src/test/regress/sql/multirangetypes.sql
+++ b/src/test/regress/sql/multirangetypes.sql
@@ -700,6 +700,22 @@ select _textrange1(textrange2('a','z')) @> 'b'::text;
 drop type textrange1;
 drop type textrange2;
 
+--
+-- CREATE TYPE checks for CREATE on multirange schema
+--
+create role regress_mr;
+create schema mr_sch;
+set role regress_mr;
+create type mytype as range (subtype=int4, 
multirange_type_name=mr_sch.mr_type);
+reset role;
+grant create on schema mr_sch to regress_mr;
+set role regress_mr;
+create type mytype as range (subtype=int4, 
multirange_type_name=mr_sch.mr_type);
+reset role;
+drop type mytype;
+drop schema mr_sch;
+drop role regress_mr;
+
 --
 -- Test polymorphic type system
 --


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to