summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Sowden <jeremy@azazel.net>2021-11-30 10:55:45 +0000
committerPablo Neira Ayuso <pablo@netfilter.org>2021-12-06 22:32:06 +0100
commit6709f6b52cdd63d2c9b246b7fc6bfb57c4f18e00 (patch)
tree200f127cac454009cb259dc406e527849cad329a
parent754d178b53a913b2ff4e2259cbca068a14a19777 (diff)
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 <jeremy@azazel.net> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r--output/pgsql/ulogd_output_PGSQL.c44
1 files 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) {