From 59f11a5d0eea79c3c676592559305df65096e702 Mon Sep 17 00:00:00 2001 From: Lars Erik Wik Date: Wed, 3 Dec 2025 10:45:07 +0100 Subject: [PATCH 1/4] Changed severity of log level in CreateTableColumns() Changed the severity of the log message "Trying to create table..." from `LOG_LEVEL_ERR` to `LOG_LEVEL_VERBOSE`. Signed-off-by: Lars Erik Wik --- cf-agent/verify_databases.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cf-agent/verify_databases.c b/cf-agent/verify_databases.c index 1b99e1ad20..4b7126d935 100644 --- a/cf-agent/verify_databases.c +++ b/cf-agent/verify_databases.c @@ -748,7 +748,7 @@ static bool CreateTableColumns(CfdbConn *cfdb, char *table, Rlist *columns) char **name_table, **type_table; int no_of_cols = RlistLen(columns); - Log(LOG_LEVEL_ERR, "Trying to create table '%s'", table); + Log(LOG_LEVEL_VERBOSE, "Trying to create table '%s'", table); if (!NewSQLColumns(table, columns, &name_table, &type_table, &size_table, &done)) { From 832ad349bbecc14d9c14186a7c3b51dacede0396 Mon Sep 17 00:00:00 2001 From: Lars Erik Wik Date: Wed, 3 Dec 2025 10:54:55 +0100 Subject: [PATCH 2/4] Fixed use of uninitialized buffer in CreateTableColumns() Fixed potential bug causing an uninitialized buffer (containing garbage data) to be sent as a database query when creating a table in the databases promise type. Changelog: Commit Signed-off-by: Lars Erik Wik --- cf-agent/verify_databases.c | 45 ++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/cf-agent/verify_databases.c b/cf-agent/verify_databases.c index 4b7126d935..09dab8fe10 100644 --- a/cf-agent/verify_databases.c +++ b/cf-agent/verify_databases.c @@ -755,35 +755,38 @@ static bool CreateTableColumns(CfdbConn *cfdb, char *table, Rlist *columns) return false; } - if (no_of_cols > 0) + if (no_of_cols <= 0) { - snprintf(query, CF_BUFSIZE - 1, "create table %s(", table); + Log(LOG_LEVEL_ERR, "Attempted to create table '%s' without any columns", table); + return false; + } - for (i = 0; i < no_of_cols; i++) - { - Log(LOG_LEVEL_VERBOSE, "Forming column template %s %s %d", name_table[i], type_table[i], - size_table[i]);; + snprintf(query, CF_BUFSIZE - 1, "create table %s(", table); - if (size_table[i] > 0) - { - snprintf(entry, CF_MAXVARSIZE - 1, "%s %s(%d)", name_table[i], type_table[i], size_table[i]); - } - else - { - snprintf(entry, CF_MAXVARSIZE - 1, "%s %s", name_table[i], type_table[i]); - } - - strcat(query, entry); + for (i = 0; i < no_of_cols; i++) + { + Log(LOG_LEVEL_VERBOSE, "Forming column template %s %s %d", name_table[i], type_table[i], + size_table[i]);; - if (i < no_of_cols - 1) - { - strcat(query, ","); - } + if (size_table[i] > 0) + { + snprintf(entry, CF_MAXVARSIZE - 1, "%s %s(%d)", name_table[i], type_table[i], size_table[i]); + } + else + { + snprintf(entry, CF_MAXVARSIZE - 1, "%s %s", name_table[i], type_table[i]); } - strcat(query, ")"); + strcat(query, entry); + + if (i < no_of_cols - 1) + { + strcat(query, ","); + } } + strcat(query, ")"); + CfVoidQueryDB(cfdb, query); DeleteSQLColumns(name_table, type_table, size_table, done, no_of_cols); return true; From ff4f9a65194cd9532a64f493dddafb3cb22f2ece Mon Sep 17 00:00:00 2001 From: Lars Erik Wik Date: Wed, 3 Dec 2025 11:10:53 +0100 Subject: [PATCH 3/4] Fixed buffer overflow in CreateTableColumns() Fixed potential buffer overflow when creating tables using the databases promise type. Ticket: ENT-13552 Changelog: Commit Signed-off-by: Lars Erik Wik --- cf-agent/verify_databases.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/cf-agent/verify_databases.c b/cf-agent/verify_databases.c index 09dab8fe10..5c93e15919 100644 --- a/cf-agent/verify_databases.c +++ b/cf-agent/verify_databases.c @@ -743,7 +743,6 @@ static int TableExists(CfdbConn *cfdb, char *name) static bool CreateTableColumns(CfdbConn *cfdb, char *table, Rlist *columns) { - char entry[CF_MAXVARSIZE], query[CF_BUFSIZE]; int i, *size_table, *done; char **name_table, **type_table; int no_of_cols = RlistLen(columns); @@ -761,7 +760,8 @@ static bool CreateTableColumns(CfdbConn *cfdb, char *table, Rlist *columns) return false; } - snprintf(query, CF_BUFSIZE - 1, "create table %s(", table); + Buffer *query = BufferNew(); + BufferPrintf(query, "create table %s(", table); for (i = 0; i < no_of_cols; i++) { @@ -770,24 +770,23 @@ static bool CreateTableColumns(CfdbConn *cfdb, char *table, Rlist *columns) if (size_table[i] > 0) { - snprintf(entry, CF_MAXVARSIZE - 1, "%s %s(%d)", name_table[i], type_table[i], size_table[i]); + BufferAppendF(query, "%s %s(%d)", name_table[i], type_table[i], size_table[i]); } else { - snprintf(entry, CF_MAXVARSIZE - 1, "%s %s", name_table[i], type_table[i]); + BufferAppendF(query, "%s %s", name_table[i], type_table[i]); } - strcat(query, entry); - if (i < no_of_cols - 1) { - strcat(query, ","); + BufferAppendChar(query, ','); } } - strcat(query, ")"); + BufferAppendChar(query, ')'); - CfVoidQueryDB(cfdb, query); + CfVoidQueryDB(cfdb, BufferData(query)); + BufferDestroy(query); DeleteSQLColumns(name_table, type_table, size_table, done, no_of_cols); return true; } From 6b6a90d3366cf120525be511960311fe1b6a610c Mon Sep 17 00:00:00 2001 From: Lars Erik Wik Date: Wed, 3 Dec 2025 11:45:10 +0100 Subject: [PATCH 4/4] cf_sql.{c,h}: constified arguments in DB query functions Signed-off-by: Lars Erik Wik --- cf-agent/cf_sql.c | 4 ++-- cf-agent/cf_sql.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cf-agent/cf_sql.c b/cf-agent/cf_sql.c index aaf936ec71..23684e12cc 100644 --- a/cf-agent/cf_sql.c +++ b/cf-agent/cf_sql.c @@ -384,7 +384,7 @@ void CfCloseDB(CfdbConn *cfdb) /*****************************************************************************/ -void CfVoidQueryDB(CfdbConn *cfdb, char *query) +void CfVoidQueryDB(CfdbConn *cfdb, const char *query) { if (!cfdb->connected) { @@ -398,7 +398,7 @@ void CfVoidQueryDB(CfdbConn *cfdb, char *query) /*****************************************************************************/ -void CfNewQueryDB(CfdbConn *cfdb, char *query) +void CfNewQueryDB(CfdbConn *cfdb, const char *query) { cfdb->result = false; cfdb->row = 0; diff --git a/cf-agent/cf_sql.h b/cf-agent/cf_sql.h index fb55cd3432..fb11a4131e 100644 --- a/cf-agent/cf_sql.h +++ b/cf-agent/cf_sql.h @@ -42,8 +42,8 @@ typedef struct void CfConnectDB(CfdbConn *cfdb, DatabaseType dbtype, char *remotehost, char *dbuser, char *passwd, char *db); void CfCloseDB(CfdbConn *cfdb); -void CfVoidQueryDB(CfdbConn *cfdb, char *query); -void CfNewQueryDB(CfdbConn *cfdb, char *query); +void CfVoidQueryDB(CfdbConn *cfdb, const char *query); +void CfNewQueryDB(CfdbConn *cfdb, const char *query); char **CfFetchRow(CfdbConn *cfdb); char *CfFetchColumn(CfdbConn *cfdb, int col); void CfDeleteQuery(CfdbConn *cfdb);