summaryrefslogtreecommitdiff
path: root/src/backend/commands/indexcmds.c
diff options
context:
space:
mode:
authorNathan Bossart <nathan@postgresql.org>2025-10-15 12:47:33 -0500
committerNathan Bossart <nathan@postgresql.org>2025-10-15 12:47:33 -0500
commit688dc6299a5bda3221db99fdd957ac9edf11c8a6 (patch)
tree7d9365865a0cb3052e924edba94329022f06647e /src/backend/commands/indexcmds.c
parent5f4c3b33a97688174dfff44bdbc9ac228095714a (diff)
Fix lookups in pg_{clear,restore}_{attribute,relation}_stats().
Presently, these functions look up the relation's OID, lock it, and then check privileges. Not only does this approach provide no guarantee that the locked relation matches the arguments of the lookup, but it also allows users to briefly lock relations for which they do not have privileges, which might enable denial-of-service attacks. This commit adjusts these functions to use RangeVarGetRelidExtended(), which is purpose-built to avoid both of these issues. The new RangeVarGetRelidCallback function is somewhat complicated because it must handle both tables and indexes, and for indexes, we must check privileges on the parent table and lock it first. Also, it needs to handle a couple of extremely unlikely race conditions involving concurrent OID reuse. A downside of this change is that the coding doesn't allow for locking indexes in AccessShare mode anymore; everything is locked in ShareUpdateExclusive mode. Per discussion, the original choice of lock levels was intended for a now defunct implementation that used in-place updates, so we believe this change is okay. Reviewed-by: Jeff Davis <pgsql@j-davis.com> Discussion: https://postgr.es/m/Z8zwVmGzXyDdkAXj%40nathan Backpatch-through: 18
Diffstat (limited to 'src/backend/commands/indexcmds.c')
0 files changed, 0 insertions, 0 deletions