Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit1c316e3

Browse files
committed
Add missing buffer lock acquisition in GetTupleForTrigger().
If we had not been holding buffer pin continuously since the tuple wasinitially fetched by the UPDATE or DELETE query, it would be possible forVACUUM or a page-prune operation to move the tuple while we're trying tocopy it. This would result in a garbage "old" tuple value being passed toan AFTER ROW UPDATE or AFTER ROW DELETE trigger. The preconditions forthis are somewhat improbable, and the timing constraints are very tight;so it's not so surprising that this hasn't been reported from the field,even though the bug has been there a long time.Problem found by Andres Freund. Back-patch to all active branches.
1 parent2c55189 commit1c316e3

File tree

1 file changed

+12
-0
lines changed

1 file changed

+12
-0
lines changed

‎src/backend/commands/trigger.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2663,6 +2663,16 @@ ltrmark:;
26632663

26642664
buffer=ReadBuffer(relation,ItemPointerGetBlockNumber(tid));
26652665

2666+
/*
2667+
* Although we already know this tuple is valid, we must lock the
2668+
* buffer to ensure that no one has a buffer cleanup lock; otherwise
2669+
* they might move the tuple while we try to copy it. But we can
2670+
* release the lock before actually doing the heap_copytuple call,
2671+
* since holding pin is sufficient to prevent anyone from getting a
2672+
* cleanup lock they don't already hold.
2673+
*/
2674+
LockBuffer(buffer,BUFFER_LOCK_SHARE);
2675+
26662676
page=BufferGetPage(buffer);
26672677
lp=PageGetItemId(page,ItemPointerGetOffsetNumber(tid));
26682678

@@ -2672,6 +2682,8 @@ ltrmark:;
26722682
tuple.t_len=ItemIdGetLength(lp);
26732683
tuple.t_self=*tid;
26742684
tuple.t_tableOid=RelationGetRelid(relation);
2685+
2686+
LockBuffer(buffer,BUFFER_LOCK_UNLOCK);
26752687
}
26762688

26772689
result=heap_copytuple(&tuple);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp