From 6709f6b52cdd63d2c9b246b7fc6bfb57c4f18e00 Mon Sep 17 00:00:00 2001 From: Jeremy Sowden Date: Tue, 30 Nov 2021 10:55:45 +0000 Subject: output: PGSQL: fix non-`connstring` configuration of DB connection In `open_db_pgsql`, we test whether various config-settings are defined by comparing their string values to `NULL`. However, the `u.string` member of `struct config_entry` is an array, not a pointer, so it is never `NULL`. Instead, check whether the string is empty. Use a pointer to the end of the `connstr` buffer and `sprintf`, rather than repeated `strcat`s. Signed-off-by: Jeremy Sowden Signed-off-by: Pablo Neira Ayuso --- output/pgsql/ulogd_output_PGSQL.c | 44 +++++++++++++++------------------------ 1 file changed, 17 insertions(+), 27 deletions(-) diff --git a/output/pgsql/ulogd_output_PGSQL.c b/output/pgsql/ulogd_output_PGSQL.c index 71d9403..04c2665 100644 --- a/output/pgsql/ulogd_output_PGSQL.c +++ b/output/pgsql/ulogd_output_PGSQL.c @@ -232,48 +232,38 @@ static int open_db_pgsql(struct ulogd_pluginstance *upi) char *schema = NULL; char pgbuf[128]; - if (!connstr) { - char *server = host_ce(upi->config_kset).u.string; - unsigned int port = port_ce(upi->config_kset).u.value; - char *user = user_ce(upi->config_kset).u.string; - char *pass = pass_ce(upi->config_kset).u.string; - char *db = db_ce(upi->config_kset).u.string; + if (!connstr[0]) { + char *server = host_ce(upi->config_kset).u.string; + unsigned int port = port_ce(upi->config_kset).u.value; + char *user = user_ce(upi->config_kset).u.string; + char *pass = pass_ce(upi->config_kset).u.string; + char *db = db_ce(upi->config_kset).u.string; + char *cp; /* 80 is more than what we need for the fixed parts below */ len = 80 + strlen(user) + strlen(db); /* hostname and and password are the only optionals */ - if (server) + if (server[0]) len += strlen(server); - if (pass) + if (pass[0]) len += strlen(pass); if (port) len += 20; - connstr = (char *) malloc(len); + cp = connstr = malloc(len); if (!connstr) return -ENOMEM; - connstr[0] = '\0'; - if (server && strlen(server) > 0) { - strcpy(connstr, " host="); - strcat(connstr, server); - } + if (server[0]) + cp += sprintf(cp, "host=%s ", server); - if (port) { - char portbuf[20]; - snprintf(portbuf, sizeof(portbuf), " port=%u", port); - strcat(connstr, portbuf); - } + if (port) + cp += sprintf(cp, "port=%u ", port); - strcat(connstr, " dbname="); - strcat(connstr, db); - strcat(connstr, " user="); - strcat(connstr, user); + cp += sprintf(cp, "dbname=%s user=%s", db, user); - if (pass) { - strcat(connstr, " password="); - strcat(connstr, pass); - } + if (pass[0]) + cp += sprintf(cp, " password=%s", pass); } pi->dbh = PQconnectdb(connstr); if (PQstatus(pi->dbh) != CONNECTION_OK) { -- cgit v1.2.3