]> git.ipfire.org Git - thirdparty/ulogd2.git/commitdiff
output: SQLITE3: improve mapping of fields to DB columns
authorPablo Neira Ayuso <pablo@netfilter.org>
Mon, 3 Jan 2022 15:10:01 +0000 (16:10 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 3 Jan 2022 15:10:28 +0000 (16:10 +0100)
Currently, we derive a field-name by replacing all the underscores in a
DB column-name with full-stops and use the field-name to find the
matching input-key.  However, every time we create a new insert SQL
statement, we derive the column-names by copying the field-names to a
buffer, replacing all the full-stops with underscores, and then
appending the buffer containing the column-name to the one containing
the statments.

Apart from the inefficiency, `strncpy` is used to do the copies, which
leads gcc to complain:

  ulogd_output_SQLITE3.c:234:17: warning: `strncpy` output may be truncated copying 31 bytes from a string of length 31

Instead, leave the underscores in the field-name, but copy it once to a
buffer in which the underscores are replaced and use this to find the
input-key.

Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
output/sqlite3/ulogd_output_SQLITE3.c

index d2857dfdc48f48da30e1fd020aee55853801ce57..d4bd1baf1f36e55deedf3ed93c2a38e28c3f2f8e 100644 (file)
@@ -214,10 +214,8 @@ sqlite3_createstmt(struct ulogd_pluginstance *pi)
 {
        struct sqlite3_priv *priv = (void *)pi->private;
        struct field *f;
-       char buf[ULOGD_MAX_KEYLEN + 1];
-       char *underscore;
-       char *stmt_pos;
        int i, cols = 0;
+       char *stmt_pos;
 
        if (priv->stmt != NULL)
                free(priv->stmt);
@@ -231,13 +229,7 @@ sqlite3_createstmt(struct ulogd_pluginstance *pi)
        stmt_pos += sprintf(stmt_pos, "insert into %s (", table_ce(pi));
 
        tailq_for_each(f, priv->fields, link) {
-               strncpy(buf, f->name, ULOGD_MAX_KEYLEN);
-
-               while ((underscore = strchr(buf, '.')))
-                       *underscore = '_';
-
-               stmt_pos += sprintf(stmt_pos, "%s,", buf);
-
+               stmt_pos += sprintf(stmt_pos, "%s,", f->name);
                cols++;
        }
 
@@ -269,10 +261,15 @@ sqlite3_createstmt(struct ulogd_pluginstance *pi)
 static struct ulogd_key *
 ulogd_find_key(struct ulogd_pluginstance *pi, const char *name)
 {
+       char buf[ULOGD_MAX_KEYLEN + 1] = "";
        unsigned int i;
 
+       /* replace all underscores with dots */
+       for (i = 0; i < sizeof(buf) - 1 && name[i]; ++i)
+               buf[i] = name[i] != '_' ? name[i] : '.';
+
        for (i = 0; i < pi->input.num_keys; i++) {
-               if (strcmp(pi->input.keys[i].name, name) == 0)
+               if (strcmp(pi->input.keys[i].name, buf) == 0)
                        return &pi->input.keys[i];
        }
 
@@ -331,11 +328,6 @@ sqlite3_init_db(struct ulogd_pluginstance *pi)
                snprintf(f->name, sizeof(f->name),
                         "%s", sqlite3_column_name(schema_stmt, col));
 
-               /* replace all underscores with dots */
-               for (underscore = f->name;
-                    (underscore = strchr(underscore, '_')) != NULL; )
-                       *underscore = '.';
-
                DEBUGP("field '%s' found\n", f->name);
 
                if ((f->key = ulogd_find_key(pi, f->name)) == NULL) {