]> git.ipfire.org Git - thirdparty/ulogd2.git/commitdiff
output: PGSQL: fix non-`connstring` configuration of DB connection
authorJeremy Sowden <jeremy@azazel.net>
Tue, 30 Nov 2021 10:55:45 +0000 (10:55 +0000)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 6 Dec 2021 21:32:06 +0000 (22:32 +0100)
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>
output/pgsql/ulogd_output_PGSQL.c

index 71d94031ac4e73db747984bd810079bf8638f865..04c266510a40e83ee978ced33007540ff17a1ae6 100644 (file)
@@ -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) {