diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2020-11-01 11:26:16 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2020-11-01 11:26:31 -0500 |
commit | 7d72fd9e6db686c9a499d4238d23525437adc132 (patch) | |
tree | ac53b6a094d502e153dbd3a67ca702d6b8977ba3 /src | |
parent | 41a033b5054e047cc67a92e17fbbe4accb658b3b (diff) | |
download | postgresql-7d72fd9e6db686c9a499d4238d23525437adc132.tar.gz postgresql-7d72fd9e6db686c9a499d4238d23525437adc132.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.c | 14 |
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 ef2d4e8977e..590a5055f31 100644 --- a/src/bin/pg_dump/pg_backup_db.c +++ b/src/bin/pg_dump/pg_backup_db.c @@ -543,9 +543,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; @@ -572,13 +572,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; |