From 0041941f5bbe48ff3a05942efc6aa65f4f389efc Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 1 Nov 2020 11:26:16 -0500 Subject: [PATCH] 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. --- src/bin/pg_dump/pg_backup_db.c | 14 ++++++++------ 1 file 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 30703359e1..bf63b6fe2d 100644 --- a/src/bin/pg_dump/pg_backup_db.c +++ b/src/bin/pg_dump/pg_backup_db.c @@ -541,9 +541,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; @@ -570,13 +570,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;