Skip to content

Commit 36739e0

Browse files
committed
PG-1446 Add missing lock to pg_tde_create_wal_key()
Make sure that we lock the key file before adding a WAL key. It should be harmless since this happens very early in the start but if we ever add the ability to rotate WAL keys while running this will become an issue. Additionally we add asserts to make sure we hold the right lock level when we open the key map file.
1 parent 2c74cdc commit 36739e0

File tree

3 files changed

+12
-4
lines changed

3 files changed

+12
-4
lines changed

contrib/pg_tde/src/access/pg_tde_tdemap.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,9 @@ pg_tde_create_wal_key(InternalKey *rel_key_data, const RelFileLocator *newrlocat
222222
{
223223
TDEPrincipalKey *principal_key;
224224

225-
principal_key = get_principal_key_from_keyring(newrlocator->dbOid);
225+
LWLockAcquire(tde_lwlock_enc_keys(), LW_SHARED);
226+
227+
principal_key = GetPrincipalKey(newrlocator->dbOid, LW_SHARED);
226228
if (principal_key == NULL)
227229
{
228230
ereport(ERROR,
@@ -237,6 +239,8 @@ pg_tde_create_wal_key(InternalKey *rel_key_data, const RelFileLocator *newrlocat
237239
* Add the encrypted key to the key map data file structure.
238240
*/
239241
pg_tde_write_key_map_entry(newrlocator, rel_key_data, principal_key, false);
242+
243+
LWLockRelease(tde_lwlock_enc_keys());
240244
}
241245

242246
/*
@@ -872,6 +876,8 @@ pg_tde_open_file_write(const char *tde_filename, TDEPrincipalKeyInfo *principal_
872876
off_t bytes_written = 0;
873877
int file_flags = O_RDWR | O_CREAT | PG_BINARY | (truncate ? O_TRUNC : 0);
874878

879+
Assert(LWLockHeldByMeInMode(tde_lwlock_enc_keys(), LW_EXCLUSIVE));
880+
875881
fd = pg_tde_open_file_basic(tde_filename, file_flags, false);
876882

877883
pg_tde_file_header_read(tde_filename, fd, &fheader, &bytes_read);
@@ -1021,6 +1027,8 @@ pg_tde_open_file_read(const char *tde_filename, off_t *curr_pos)
10211027
TDEFileHeader fheader;
10221028
off_t bytes_read = 0;
10231029

1030+
Assert(LWLockHeldByMeInMode(tde_lwlock_enc_keys(), LW_SHARED) || LWLockHeldByMeInMode(tde_lwlock_enc_keys(), LW_EXCLUSIVE));
1031+
10241032
fd = pg_tde_open_file_basic(tde_filename, O_RDONLY | PG_BINARY, false);
10251033

10261034
pg_tde_file_header_read(tde_filename, fd, &fheader, &bytes_read);

contrib/pg_tde/src/catalog/tde_principal_key.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ static bool pg_tde_is_same_principal_key(TDEPrincipalKey *a, TDEPrincipalKey *b)
100100
static void pg_tde_update_global_principal_key_everywhere(TDEPrincipalKey *oldKey, TDEPrincipalKey *newKey);
101101
static void push_principal_key_to_cache(TDEPrincipalKey *principalKey);
102102
static Datum pg_tde_get_key_info(PG_FUNCTION_ARGS, Oid dbOid);
103+
static TDEPrincipalKey *get_principal_key_from_keyring(Oid dbOid);
103104
static TDEPrincipalKey *GetPrincipalKeyNoDefault(Oid dbOid, LWLockMode lockMode);
104105
static void set_principal_key_with_keyring(const char *key_name,
105106
const char *provider_name,
@@ -708,7 +709,7 @@ pg_tde_get_key_info(PG_FUNCTION_ARGS, Oid dbOid)
708709
*
709710
* Caller should hold an exclusive tde_lwlock_enc_keys lock
710711
*/
711-
TDEPrincipalKey *
712+
static TDEPrincipalKey *
712713
get_principal_key_from_keyring(Oid dbOid)
713714
{
714715
TDEPrincipalKeyInfo *principalKeyInfo;
@@ -717,7 +718,7 @@ get_principal_key_from_keyring(Oid dbOid)
717718
KeyringReturnCodes keyring_ret;
718719
TDEPrincipalKey *principalKey;
719720

720-
/* Assert(LWLockHeldByMeInMode(tde_lwlock_enc_keys(), LW_EXCLUSIVE)); */
721+
Assert(LWLockHeldByMeInMode(tde_lwlock_enc_keys(), LW_EXCLUSIVE));
721722

722723
principalKeyInfo = pg_tde_get_principal_key_info(dbOid);
723724
if (principalKeyInfo == NULL)

contrib/pg_tde/src/include/catalog/tde_principal_key.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,5 @@ extern TDEPrincipalKey *GetPrincipalKey(Oid dbOid, void *lockMode);
5454
#endif
5555

5656
extern void xl_tde_perform_rotate_key(XLogPrincipalKeyRotate *xlrec);
57-
extern TDEPrincipalKey *get_principal_key_from_keyring(Oid dbOid);
5857

5958
#endif /* PG_TDE_PRINCIPAL_KEY_H */

0 commit comments

Comments
 (0)