mirror of
https://github.com/postgres/postgres.git
synced 2025-05-18 17:41:14 +03:00
Acquire ControlFileLock in relevant SQL functions.
Commit dc7d70ea added functions that read the control file, but didn't acquire ControlFileLock. With unlucky timing, file systems that have weak interlocking like ext4 and ntfs could expose partially overwritten contents, and the checksum would fail. Back-patch to all supported releases. Reviewed-by: David Steele <david@pgmasters.net> Reviewed-by: Anton A. Melnikov <aamelnikov@inbox.ru> Reviewed-by: Michael Paquier <michael@paquier.xyz> Discussion: https://postgr.es/m/20221123014224.xisi44byq3cf5psi%40awork3.anarazel.de
This commit is contained in:
parent
6fd1dbdb21
commit
ae9da357bd
@ -24,6 +24,7 @@
|
|||||||
#include "common/controldata_utils.h"
|
#include "common/controldata_utils.h"
|
||||||
#include "funcapi.h"
|
#include "funcapi.h"
|
||||||
#include "miscadmin.h"
|
#include "miscadmin.h"
|
||||||
|
#include "storage/lwlock.h"
|
||||||
#include "utils/builtins.h"
|
#include "utils/builtins.h"
|
||||||
#include "utils/pg_lsn.h"
|
#include "utils/pg_lsn.h"
|
||||||
#include "utils/timestamp.h"
|
#include "utils/timestamp.h"
|
||||||
@ -54,7 +55,9 @@ pg_control_system(PG_FUNCTION_ARGS)
|
|||||||
tupdesc = BlessTupleDesc(tupdesc);
|
tupdesc = BlessTupleDesc(tupdesc);
|
||||||
|
|
||||||
/* read the control file */
|
/* read the control file */
|
||||||
|
LWLockAcquire(ControlFileLock, LW_SHARED);
|
||||||
ControlFile = get_controlfile(DataDir, &crc_ok);
|
ControlFile = get_controlfile(DataDir, &crc_ok);
|
||||||
|
LWLockRelease(ControlFileLock);
|
||||||
if (!crc_ok)
|
if (!crc_ok)
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errmsg("calculated CRC checksum does not match value stored in file")));
|
(errmsg("calculated CRC checksum does not match value stored in file")));
|
||||||
@ -132,7 +135,9 @@ pg_control_checkpoint(PG_FUNCTION_ARGS)
|
|||||||
tupdesc = BlessTupleDesc(tupdesc);
|
tupdesc = BlessTupleDesc(tupdesc);
|
||||||
|
|
||||||
/* Read the control file. */
|
/* Read the control file. */
|
||||||
|
LWLockAcquire(ControlFileLock, LW_SHARED);
|
||||||
ControlFile = get_controlfile(DataDir, &crc_ok);
|
ControlFile = get_controlfile(DataDir, &crc_ok);
|
||||||
|
LWLockRelease(ControlFileLock);
|
||||||
if (!crc_ok)
|
if (!crc_ok)
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errmsg("calculated CRC checksum does not match value stored in file")));
|
(errmsg("calculated CRC checksum does not match value stored in file")));
|
||||||
@ -235,7 +240,9 @@ pg_control_recovery(PG_FUNCTION_ARGS)
|
|||||||
tupdesc = BlessTupleDesc(tupdesc);
|
tupdesc = BlessTupleDesc(tupdesc);
|
||||||
|
|
||||||
/* read the control file */
|
/* read the control file */
|
||||||
|
LWLockAcquire(ControlFileLock, LW_SHARED);
|
||||||
ControlFile = get_controlfile(DataDir, &crc_ok);
|
ControlFile = get_controlfile(DataDir, &crc_ok);
|
||||||
|
LWLockRelease(ControlFileLock);
|
||||||
if (!crc_ok)
|
if (!crc_ok)
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errmsg("calculated CRC checksum does not match value stored in file")));
|
(errmsg("calculated CRC checksum does not match value stored in file")));
|
||||||
@ -300,7 +307,9 @@ pg_control_init(PG_FUNCTION_ARGS)
|
|||||||
tupdesc = BlessTupleDesc(tupdesc);
|
tupdesc = BlessTupleDesc(tupdesc);
|
||||||
|
|
||||||
/* read the control file */
|
/* read the control file */
|
||||||
|
LWLockAcquire(ControlFileLock, LW_SHARED);
|
||||||
ControlFile = get_controlfile(DataDir, &crc_ok);
|
ControlFile = get_controlfile(DataDir, &crc_ok);
|
||||||
|
LWLockRelease(ControlFileLock);
|
||||||
if (!crc_ok)
|
if (!crc_ok)
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errmsg("calculated CRC checksum does not match value stored in file")));
|
(errmsg("calculated CRC checksum does not match value stored in file")));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user