From 67b0be90f16f12b875a70e7a5ae10c5a7b584ece Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Mon, 3 Jan 2022 16:10:01 +0100 Subject: output: SQLITE3: improve mapping of fields to DB columns 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 Signed-off-by: Pablo Neira Ayuso --- output/sqlite3/ulogd_output_SQLITE3.c | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/output/sqlite3/ulogd_output_SQLITE3.c b/output/sqlite3/ulogd_output_SQLITE3.c index d2857df..d4bd1ba 100644 --- a/output/sqlite3/ulogd_output_SQLITE3.c +++ b/output/sqlite3/ulogd_output_SQLITE3.c @@ -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) { -- cgit v1.2.3