Don't test already-referenced pointer for nullness
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Tue, 16 Jan 2024 11:27:52 +0000 (12:27 +0100)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Tue, 16 Jan 2024 11:27:52 +0000 (12:27 +0100)
Commit b8ba7344e9eb added in PQgetResult a derefence to a pointer
returned by pqPrepareAsyncResult(), before some other code that was
already testing that pointer for nullness.  But since commit
618c16707a6d (in Postgres 15), pqPrepareAsyncResult() doesn't ever
return NULL (a statically-allocated result is returned if OOM).  So in
branches 15 and up, we can remove the redundant pointer check with no
harm done.

However, in branch 14, pqPrepareAsyncResult() can indeed return NULL if
it runs out of memory.  Fix things there by adding a null pointer check
before dereferencing the pointer.  This should hint Coverity that the
preexisting check is not redundant but necessary.

Backpatch to 14, like b8ba7344e9eb.

Per Coverity.

src/interfaces/libpq/fe-exec.c

index 11c563a52683b3b2f6ae80ec7e861f2347695c3b..fa9d6aaddf5097c535d5e82c3cca75276e3c1ef1 100644 (file)
@@ -841,6 +841,8 @@ pqSaveWriteError(PGconn *conn)
  * using whatever is in conn->errorMessage.  In any case, clear the async
  * result storage, and update our notion of how much error text has been
  * returned to the application.
+ *
+ * Note that in no case (not even OOM) do we return NULL.
  */
 PGresult *
 pqPrepareAsyncResult(PGconn *conn)
@@ -2137,7 +2139,7 @@ PQgetResult(PGconn *conn)
                 * (In other words: we don't return a NULL after a pipeline
                 * sync.)
                 */
-               if (res && res->resultStatus == PGRES_PIPELINE_SYNC)
+               if (res->resultStatus == PGRES_PIPELINE_SYNC)
                    pqPipelineProcessQueue(conn);
            }
            else