aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2020-11-01 11:26:16 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2020-11-01 11:26:16 -0500
commit7f4235032f0d75ea1ad29b192d57fee3d8fe533e (patch)
treec7c8d6fa42d25479421ede9757763588a759c0cf /src
parentb17ff07aa3eb142d2cde2ea00e4a4e8f63686f96 (diff)
downloadpostgresql-7f4235032f0d75ea1ad29b192d57fee3d8fe533e.tar.gz
postgresql-7f4235032f0d75ea1ad29b192d57fee3d8fe533e.zip
Avoid null pointer dereference if error result lacks SQLSTATE.
Although error results received from the backend should always have a SQLSTATE field, ones generated by libpq won't, making this code vulnerable to a crash after, say, untimely loss of connection. Noted by Coverity. Oversight in commit 403a3d91c. Back-patch to 9.5, as that was.
Diffstat (limited to 'src')
-rw-r--r--src/bin/pg_dump/pg_backup_db.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/src/bin/pg_dump/pg_backup_db.c b/src/bin/pg_dump/pg_backup_db.c
index 28b2892538a..6a1e1d3acb2 100644
--- a/src/bin/pg_dump/pg_backup_db.c
+++ b/src/bin/pg_dump/pg_backup_db.c
@@ -540,9 +540,9 @@ bool
IsLockTableGeneric(Archive *AHX)
{
ArchiveHandle *AH = (ArchiveHandle *) AHX;
- PGresult *res;
- char *sqlstate;
- bool retval;
+ PGresult *res;
+ char *sqlstate;
+ bool retval;
if (AHX->remoteVersion >= 140000)
return true;
@@ -569,13 +569,15 @@ IsLockTableGeneric(Archive *AHX)
break;
case PGRES_FATAL_ERROR:
sqlstate = PQresultErrorField(res, PG_DIAG_SQLSTATE);
- if (strcmp(sqlstate, ERRCODE_WRONG_OBJECT_TYPE) == 0)
+ if (sqlstate &&
+ strcmp(sqlstate, ERRCODE_WRONG_OBJECT_TYPE) == 0)
{
retval = false;
break;
}
- else if (strcmp(sqlstate, ERRCODE_LOCK_NOT_AVAILABLE) == 0 ||
- strcmp(sqlstate, ERRCODE_INSUFFICIENT_PRIVILEGE) == 0)
+ else if (sqlstate &&
+ (strcmp(sqlstate, ERRCODE_LOCK_NOT_AVAILABLE) == 0 ||
+ strcmp(sqlstate, ERRCODE_INSUFFICIENT_PRIVILEGE) == 0))
{
retval = true;
break;