Release PQconninfoOptions array in GetDbnameFromConnectionOptions().
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 24 Mar 2024 16:31:05 +0000 (12:31 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 24 Mar 2024 16:31:05 +0000 (12:31 -0400)
It wasn't getting freed in one code path, which Coverity identified as
a resource leak.  It's probably of little consequence, but re-ordering
the code into the correct sequence is no more work than dismissing the
complaint.  Minor oversight in commit a145f424d.

While here, improve the unreasonably clunky coding of
FindDbnameInConnParams: use of an output parameter is unnecessary
and prone to uninitialized-variable problems.

src/bin/pg_basebackup/streamutil.c

index 9ffd5a6ebb5a1e71e7b296e760ce40338aa28952..d0efd8600ca96178007ca35ccf377034b77ebcba 100644 (file)
@@ -34,7 +34,7 @@
 int            WalSegSz;
 
 static bool RetrieveDataDirCreatePerm(PGconn *conn);
-static void FindDbnameInConnParams(PQconninfoOption *conn_opts, char **dbname);
+static char *FindDbnameInConnParams(PQconninfoOption *conn_opts);
 
 /* SHOW command for replication connection was introduced in version 10 */
 #define MINIMUM_VERSION_FOR_SHOW_CMD 100000
@@ -272,21 +272,21 @@ GetConnection(void)
  * FindDbnameInConnParams
  *
  * This is a helper function for GetDbnameFromConnectionOptions(). Extract
- * the value of dbname from PQconninfoOption parameters.
+ * the value of dbname from PQconninfoOption parameters, if it's present.
+ * Returns a strdup'd result or NULL.
  */
-static void
-FindDbnameInConnParams(PQconninfoOption *conn_opts, char **dbname)
+static char *
+FindDbnameInConnParams(PQconninfoOption *conn_opts)
 {
    PQconninfoOption *conn_opt;
 
-   Assert(dbname != NULL);
-
    for (conn_opt = conn_opts; conn_opt->keyword != NULL; conn_opt++)
    {
-       if ((strcmp(conn_opt->keyword, "dbname") == 0) &&
+       if (strcmp(conn_opt->keyword, "dbname") == 0 &&
            conn_opt->val != NULL && conn_opt->val[0] != '\0')
-           *dbname = pg_strdup(conn_opt->val);
+           return pg_strdup(conn_opt->val);
    }
+   return NULL;
 }
 
 /*
@@ -304,9 +304,9 @@ FindDbnameInConnParams(PQconninfoOption *conn_opts, char **dbname)
 char *
 GetDbnameFromConnectionOptions(void)
 {
-   PQconninfoOption *conn_opts = NULL;
+   PQconninfoOption *conn_opts;
    char       *err_msg = NULL;
-   char       *dbname = NULL;
+   char       *dbname;
 
    /* First try to get the dbname from connection string. */
    if (connection_string)
@@ -315,12 +315,11 @@ GetDbnameFromConnectionOptions(void)
        if (conn_opts == NULL)
            pg_fatal("%s", err_msg);
 
-       FindDbnameInConnParams(conn_opts, &dbname);
+       dbname = FindDbnameInConnParams(conn_opts);
+
+       PQconninfoFree(conn_opts);
        if (dbname)
-       {
-           PQconninfoFree(conn_opts);
            return dbname;
-       }
    }
 
    /*
@@ -331,7 +330,7 @@ GetDbnameFromConnectionOptions(void)
    if (conn_opts == NULL)
        pg_fatal("out of memory");
 
-   FindDbnameInConnParams(conn_opts, &dbname);
+   dbname = FindDbnameInConnParams(conn_opts);
 
    PQconninfoFree(conn_opts);
    return dbname;