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

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

commit 04d7a4856918e7684a14e0ca40eb096d4a853f10
Author: Nathan Bossart <[email protected]>
AuthorDate: Mon May 11 05:13:51 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 83849b391ea..fb47f3275ce 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -1570,6 +1570,13 @@ DefineRange(CreateRangeStmt *stmt)
                        /* we can look up the subtype name immediately */
                        multirangeNamespace = 
QualifiedNameGetCreationNamespace(defGetQualifiedName(defel),
                                                                                
                                                        &multirangeTypeName);
+
+                       /* Check we have creation rights in target namespace */
+                       aclresult = pg_namespace_aclcheck(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 55a69f49870..26fbbafc888 100644
--- a/src/test/regress/expected/multirangetypes.out
+++ b/src/test/regress/expected/multirangetypes.out
@@ -2984,6 +2984,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 e0f5e0d004a..d12b339fc5e 100644
--- a/src/test/regress/sql/multirangetypes.sql
+++ b/src/test/regress/sql/multirangetypes.sql
@@ -672,6 +672,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