Skip to content

Commit fff2a7d

Browse files
committed
Don't access catalogs to validate GUCs when not connected to a DB.
Vignesh found this bug in the check function for default_table_access_method's check hook, but that was just copied from older GUCs. Investigation by Michael and me then found the bug in further places. When not connected to a database (e.g. in a walsender connection), we cannot perform (most) GUC checks that need database access. Even when only shared tables are needed, unless they're nailed (c.f. RelationCacheInitializePhase2()), they cannot be accessed without pg_class etc. being present. Fix by extending the existing IsTransactionState() checks to also check for MyDatabaseOid. Reported-By: Vignesh C, Michael Paquier, Andres Freund Author: Vignesh C, Andres Freund Discussion: https://postgr.es/m/CALDaNm1KXK9gbZfY-p_peRFm_XrBh1OwQO1Kk6Gig0c0fVZ2uw%40mail.gmail.com Backpatch: 9.4-
1 parent 92a8864 commit fff2a7d

File tree

3 files changed

+18
-12
lines changed

3 files changed

+18
-12
lines changed

src/backend/access/table/tableamapi.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "catalog/pg_am.h"
1919
#include "catalog/pg_proc.h"
2020
#include "commands/defrem.h"
21+
#include "miscadmin.h"
2122
#include "utils/fmgroids.h"
2223
#include "utils/memutils.h"
2324
#include "utils/syscache.h"
@@ -119,10 +120,11 @@ check_default_table_access_method(char **newval, void **extra, GucSource source)
119120
}
120121

121122
/*
122-
* If we aren't inside a transaction, we cannot do database access so
123-
* cannot verify the name. Must accept the value on faith.
123+
* If we aren't inside a transaction, or not connected to a database, we
124+
* cannot do the catalog access necessary to verify the method. Must
125+
* accept the value on faith.
124126
*/
125-
if (IsTransactionState())
127+
if (IsTransactionState() && MyDatabaseId != InvalidOid)
126128
{
127129
if (!OidIsValid(get_table_am_oid(*newval, true)))
128130
{

src/backend/commands/tablespace.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,10 +1069,11 @@ bool
10691069
check_default_tablespace(char **newval, void **extra, GucSource source)
10701070
{
10711071
/*
1072-
* If we aren't inside a transaction, we cannot do database access so
1073-
* cannot verify the name. Must accept the value on faith.
1072+
* If we aren't inside a transaction, or connected to a database, we
1073+
* cannot do the catalog accesses necessary to verify the name. Must
1074+
* accept the value on faith.
10741075
*/
1075-
if (IsTransactionState())
1076+
if (IsTransactionState() && MyDatabaseId != InvalidOid)
10761077
{
10771078
if (**newval != '\0' &&
10781079
!OidIsValid(get_tablespace_oid(*newval, true)))
@@ -1190,11 +1191,12 @@ check_temp_tablespaces(char **newval, void **extra, GucSource source)
11901191
}
11911192

11921193
/*
1193-
* If we aren't inside a transaction, we cannot do database access so
1194-
* cannot verify the individual names. Must accept the list on faith.
1194+
* If we aren't inside a transaction, or connected to a database, we
1195+
* cannot do the catalog accesses necessary to verify the name. Must
1196+
* accept the value on faith.
11951197
* Fortunately, there's then also no need to pass the data to fd.c.
11961198
*/
1197-
if (IsTransactionState())
1199+
if (IsTransactionState() && MyDatabaseId != InvalidOid)
11981200
{
11991201
temp_tablespaces_extra *myextra;
12001202
Oid *tblSpcs;

src/backend/utils/cache/ts_cache.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include "catalog/pg_ts_parser.h"
3939
#include "catalog/pg_ts_template.h"
4040
#include "commands/defrem.h"
41+
#include "miscadmin.h"
4142
#include "tsearch/ts_cache.h"
4243
#include "utils/builtins.h"
4344
#include "utils/catcache.h"
@@ -590,10 +591,11 @@ bool
590591
check_TSCurrentConfig(char **newval, void **extra, GucSource source)
591592
{
592593
/*
593-
* If we aren't inside a transaction, we cannot do database access so
594-
* cannot verify the config name. Must accept it on faith.
594+
* If we aren't inside a transaction, or connected to a database, we
595+
* cannot do the catalog accesses necessary to verify the config name.
596+
* Must accept it on faith.
595597
*/
596-
if (IsTransactionState())
598+
if (IsTransactionState() && MyDatabaseId != InvalidOid)
597599
{
598600
Oid cfgId;
599601
HeapTuple tuple;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy