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

Commite275d16

Browse files
committed
Fix possible corruption of AfterTriggerEventLists in subtransaction rollback.
afterTriggerInvokeEvents failed to adjust events->tailfree when truncatingthe last chunk of an event list. This could result in the data being"de-truncated" by afterTriggerRestoreEventList during a subsequentsubtransaction abort. Even that wouldn't kill us, because the re-added datawould just be events marked DONE --- unless the data had been partiallyoverwritten by new events. Then we might crash, or in any case misbehave(perhaps fire triggers twice, or fire triggers with the wrong event data).Per bug #5622 from Thue Janus Kristensen.Back-patch to 8.4 where the current trigger list representation was introduced.
1 parent3f11971 commite275d16

File tree

1 file changed

+11
-1
lines changed

1 file changed

+11
-1
lines changed

‎src/backend/commands/trigger.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1994, Regents of the University of California
88
*
99
* IDENTIFICATION
10-
* $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.264 2010/08/05 15:25:35 rhaas Exp $
10+
* $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.265 2010/08/19 15:46:18 tgl Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -2955,6 +2955,7 @@ afterTriggerAddEvent(AfterTriggerEventList *events,
29552955
else
29562956
events->tail->next=chunk;
29572957
events->tail=chunk;
2958+
/* events->tailfree is now out of sync, but we'll fix it below */
29582959
}
29592960

29602961
/*
@@ -3356,6 +3357,15 @@ afterTriggerInvokeEvents(AfterTriggerEventList *events,
33563357
{
33573358
chunk->freeptr=CHUNK_DATA_START(chunk);
33583359
chunk->endfree=chunk->endptr;
3360+
3361+
/*
3362+
* If it's last chunk, must sync event list's tailfree too. Note
3363+
* that delete_ok must NOT be passed as true if there could be
3364+
* stacked AfterTriggerEventList values pointing at this event
3365+
* list, since we'd fail to fix their copies of tailfree.
3366+
*/
3367+
if (chunk==events->tail)
3368+
events->tailfree=chunk->freeptr;
33593369
}
33603370
}
33613371

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp