Release PQconninfoOptions array in GetDbnameFromConnectionOptions().

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.
This commit is contained in:
Tom Lane 2024-03-24 12:31:05 -04:00
parent 225e1dde46
commit d37e0d0c50
1 changed files with 14 additions and 15 deletions

View File

@ -34,7 +34,7 @@
int WalSegSz; int WalSegSz;
static bool RetrieveDataDirCreatePerm(PGconn *conn); 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 */ /* SHOW command for replication connection was introduced in version 10 */
#define MINIMUM_VERSION_FOR_SHOW_CMD 100000 #define MINIMUM_VERSION_FOR_SHOW_CMD 100000
@ -272,21 +272,21 @@ GetConnection(void)
* FindDbnameInConnParams * FindDbnameInConnParams
* *
* This is a helper function for GetDbnameFromConnectionOptions(). Extract * 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 static char *
FindDbnameInConnParams(PQconninfoOption *conn_opts, char **dbname) FindDbnameInConnParams(PQconninfoOption *conn_opts)
{ {
PQconninfoOption *conn_opt; PQconninfoOption *conn_opt;
Assert(dbname != NULL);
for (conn_opt = conn_opts; conn_opt->keyword != NULL; conn_opt++) 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') 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 * char *
GetDbnameFromConnectionOptions(void) GetDbnameFromConnectionOptions(void)
{ {
PQconninfoOption *conn_opts = NULL; PQconninfoOption *conn_opts;
char *err_msg = NULL; char *err_msg = NULL;
char *dbname = NULL; char *dbname;
/* First try to get the dbname from connection string. */ /* First try to get the dbname from connection string. */
if (connection_string) if (connection_string)
@ -315,13 +315,12 @@ GetDbnameFromConnectionOptions(void)
if (conn_opts == NULL) if (conn_opts == NULL)
pg_fatal("%s", err_msg); pg_fatal("%s", err_msg);
FindDbnameInConnParams(conn_opts, &dbname); dbname = FindDbnameInConnParams(conn_opts);
if (dbname)
{
PQconninfoFree(conn_opts); PQconninfoFree(conn_opts);
if (dbname)
return dbname; return dbname;
} }
}
/* /*
* Next try to get the dbname from default values that are available from * Next try to get the dbname from default values that are available from
@ -331,7 +330,7 @@ GetDbnameFromConnectionOptions(void)
if (conn_opts == NULL) if (conn_opts == NULL)
pg_fatal("out of memory"); pg_fatal("out of memory");
FindDbnameInConnParams(conn_opts, &dbname); dbname = FindDbnameInConnParams(conn_opts);
PQconninfoFree(conn_opts); PQconninfoFree(conn_opts);
return dbname; return dbname;