diff --git a/src/backend/commands/user.c b/src/backend/commands/user.c index cc3d564..9b7ac73 100644 --- a/src/backend/commands/user.c +++ b/src/backend/commands/user.c @@ -274,7 +274,14 @@ CreateRole(CreateRoleStmt *stmt) if (daddroleto) addroleto = (List *) daddroleto->arg; if (drolemembers) + { + ListCell *rolemember; + rolemembers = (List *) drolemembers->arg; + foreach (rolemember, rolemembers) + check_rolespec_name(lfirst(rolemember), + "Cannot add reserved role to another role."); + } if (dadminmembers) adminmembers = (List *) dadminmembers->arg; if (dvalidUntil) @@ -650,7 +657,14 @@ AlterRole(AlterRoleStmt *stmt) errmsg("invalid connection limit: %d", connlimit))); } if (drolemembers) + { + ListCell *rolemember; + rolemembers = (List *) drolemembers->arg; + foreach (rolemember, rolemembers) + check_rolespec_name(lfirst(rolemember), + "Cannot add reserved role to another role."); + } if (dvalidUntil) validUntil = strVal(dvalidUntil->arg); if (dbypassRLS) diff --git a/src/test/regress/expected/rolenames.out b/src/test/regress/expected/rolenames.out index 15a97ab..a2a4f6e 100644 --- a/src/test/regress/expected/rolenames.out +++ b/src/test/regress/expected/rolenames.out @@ -90,6 +90,9 @@ DETAIL: Role names starting with "pg_" are reserved. CREATE ROLE "pg_abcdef"; -- error ERROR: role name "pg_abcdef" is reserved DETAIL: Role names starting with "pg_" are reserved. +CREATE ROLE testrol0 USER pg_abc; -- error +ERROR: role "pg_abc" is reserved +DETAIL: Cannot add reserved role to another role. CREATE ROLE testrol0 SUPERUSER LOGIN; CREATE ROLE testrolx SUPERUSER LOGIN; CREATE ROLE testrol2 SUPERUSER; @@ -213,6 +216,9 @@ LINE 1: ALTER ROLE "none" WITH NOREPLICATION; ^ ALTER ROLE nonexistent WITH NOREPLICATION; -- error ERROR: role "nonexistent" does not exist +ALTER ROLE testrol1 USER pg_abc; -- error +ERROR: role "pg_abc" is reserved +DETAIL: Cannot add reserved role to another role. -- ALTER USER BEGIN; SELECT * FROM chkrolattr(); diff --git a/src/test/regress/sql/rolenames.sql b/src/test/regress/sql/rolenames.sql index b58a163..c160793 100644 --- a/src/test/regress/sql/rolenames.sql +++ b/src/test/regress/sql/rolenames.sql @@ -61,6 +61,7 @@ CREATE ROLE pg_abc; -- error CREATE ROLE "pg_abc"; -- error CREATE ROLE pg_abcdef; -- error CREATE ROLE "pg_abcdef"; -- error +CREATE ROLE testrol0 USER pg_abc; -- error CREATE ROLE testrol0 SUPERUSER LOGIN; CREATE ROLE testrolx SUPERUSER LOGIN; @@ -99,6 +100,7 @@ ALTER ROLE "public" WITH NOREPLICATION; -- error ALTER ROLE NONE WITH NOREPLICATION; -- error ALTER ROLE "none" WITH NOREPLICATION; -- error ALTER ROLE nonexistent WITH NOREPLICATION; -- error +ALTER ROLE testrol1 USER pg_abc; -- error -- ALTER USER BEGIN;