Fix assertion failure and segmentation fault in backup code.
authorFujii Masao <fujii@postgresql.org>
Tue, 12 Jul 2022 02:53:29 +0000 (11:53 +0900)
committerFujii Masao <fujii@postgresql.org>
Wed, 20 Jul 2022 00:57:01 +0000 (09:57 +0900)
When a non-exclusive backup is canceled, do_pg_abort_backup() is called
and resets some variables set by pg_backup_start (pg_start_backup in v14
or before). But previously it forgot to reset the session state indicating
whether a non-exclusive backup is in progress or not in this session.

This issue could cause an assertion failure when the session running
BASE_BACKUP is terminated after it executed pg_backup_start and
pg_backup_stop (pg_stop_backup in v14 or before). Also it could cause
a segmentation fault when pg_backup_stop is called after BASE_BACKUP
in the same session is canceled.

This commit fixes the issue by making do_pg_abort_backup reset
that session state.

Back-patch to all supported branches.

Author: Fujii Masao
Reviewed-by: Kyotaro Horiguchi, Masahiko Sawada, Michael Paquier, Robert Haas
Discussion: https://postgr.es/m/3374718f-9fbf-a950-6d66-d973e027f44c@oss.nttdata.com

src/backend/access/transam/xlog.c

index b809a2152cc7bbcfddf15d0bfe0c7389d3fd75e5..9854b51c6af3207aab847885e12db01e8249d1c4 100644 (file)
@@ -8791,6 +8791,8 @@ do_pg_abort_backup(int code, Datum arg)
    {
        XLogCtl->Insert.forcePageWrites = false;
    }
+
+   sessionBackupState = SESSION_BACKUP_NONE;
    WALInsertLockRelease();
 
    if (emit_warning)