The libpq manpage says the PGconn pointer should not be used
authornbk <nbk>
Wed, 21 Mar 2007 13:02:59 +0000 (13:02 +0000)
committernbk <nbk>
Wed, 21 Mar 2007 13:02:59 +0000 (13:02 +0000)
after PQfinish() has been called.

Bug found by Alexander V. Klepikov <klepikov_a@up.ua>

src/modules/rlm_sql/drivers/rlm_sql_postgresql/sql_postgresql.c

index e9bc1e5..e5ce5df 100644 (file)
@@ -61,6 +61,7 @@ typedef struct rlm_sql_postgres_sock {
 /* Prototypes */
 static int sql_store_result(SQLSOCK * sqlsocket, SQL_CONFIG *config);
 static int sql_num_fields(SQLSOCK * sqlsocket, SQL_CONFIG *config);
+static int sql_close(SQLSOCK * sqlsocket, SQL_CONFIG *config);
 
 /* Internal function. Return true if the postgresql status value
  * indicates successful completion of the query. Return false otherwise
@@ -181,7 +182,7 @@ static int sql_init_socket(SQLSOCK *sqlsocket, SQL_CONFIG *config) {
        if (PQstatus(pg_sock->conn) == CONNECTION_BAD) {
                radlog(L_ERR, "rlm_sql_postgresql: Couldn't connect socket to PostgreSQL server %s@%s:%s", config->sql_login, config->sql_server, config->sql_db);
                radlog(L_ERR, "rlm_sql_postgresql: Postgresql error '%s'", PQerrorMessage(pg_sock->conn));
-               PQfinish(pg_sock->conn);
+               sql_close(sqlsocket, config);
                return SQL_DOWN;
        }
 
@@ -414,6 +415,7 @@ static int sql_close(SQLSOCK * sqlsocket, SQL_CONFIG *config) {
 
        if (!pg_sock->conn) return 0;
 
+       /* PQfinish also frees the memory used by the PGconn structure */
        PQfinish(pg_sock->conn);
        pg_sock->conn = NULL;