Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Avoid null pointer dereference if error result lacks SQLSTATE.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 1 Nov 2020 16:26:16 +0000 (11:26 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 1 Nov 2020 16:26:31 +0000 (11:26 -0500)
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

index ef2d4e8977e4e53ab67021b0100c481c5416f5f1..590a5055f3144c0999abdcc3dd38dd75811ad6b2 100644 (file)
@@ -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;