From: Tom Lane <tgl@sss.pgh.pa.us>
To: Stephen Frost <sfrost@snowman.net>
Cc: exclusion@gmail.com
Cc: pgsql-bugs@lists.postgresql.org
Subject: Re: BUG #17062: Assert failed in RemoveRoleFromObjectPolicy() on DROP OWNED policy applied to duplicate role
Date: Thu, 17 Jun 2021 17:32:42 -0400
Message-ID: <1067500.1623965562@sss.pgh.pa.us> (raw)
In-Reply-To: <1066940.1623964553@sss.pgh.pa.us>
References: <17062-11f471ae3199ca23@postgresql.org>
<1066940.1623964553@sss.pgh.pa.us>
I wroteL
> PG Bug reporting form <noreply@postgresql.org> writes:
>> When executing the following query:
>> CREATE USER role1;
>> CREATE TABLE t1(id int);
>> CREATE POLICY p1 ON t1 TO role1,role1 USING (true);
>> DROP OWNED BY role1;
>> The server halts with the failed assertion:
> Nice. Seems to be that way at least as far back as 9.6, too.
So the proximate problem is RemoveRoleFromObjectPolicy's unfounded
assumption that there are no duplicate OIDs in a pg_policy.polroles
entry. But that function has got some other serious problems too:
* Locking. It acquires lock on the policy's relation only after
it looks up the pg_policy entry. By that point the entry could
be gone or modified.
* Why is it expensively reconstructing the dependencies of the
policy expressions? Those aren't going to be changed by this
operation. AFAICS it ought to be sufficient to remove and
rebuild the policy's shared dependencies.
I wonder whether other operations on policies share either
of these issues.
regards, tom lane
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-bugs@postgresql.org
Cc: tgl@sss.pgh.pa.us, sfrost@snowman.net, exclusion@gmail.com, pgsql-bugs@lists.postgresql.org
Subject: Re: BUG #17062: Assert failed in RemoveRoleFromObjectPolicy() on DROP OWNED policy applied to duplicate role
In-Reply-To: <1067500.1623965562@sss.pgh.pa.us>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox