From 9451642a2885dde09c27826dabd4d514be984c00 Mon Sep 17 00:00:00 2001 From: Jason Ish Date: Fri, 16 Oct 2026 16:35:25 -0600 Subject: [PATCH] eve: fix C logger signatures for generic callbacks Several C loggers are registered through a cast to EveJsonSimpleTxLogFunc, which has an incompatible signature. Clang's function sanitizer reports this as a call through a pointer to an incorrect function type. Change these loggers to the generic callback signature and register them without casts. Ticket: 9226 --- src/app-layer-ftp.c | 4 ++-- src/app-layer-ftp.h | 2 +- src/output-json-dnp3.c | 2 +- src/output-json-dnp3.h | 2 +- src/output-json-dns.c | 10 +++++----- src/output-json-dns.h | 4 ++-- src/output-json-ftp.c | 4 ++-- src/output-json-ftp.h | 2 +- src/output-json-llmnr.c | 4 ++-- src/output-json-llmnr.h | 2 +- src/output-json-mdns.c | 2 +- src/output-json-mdns.h | 2 +- src/output-json-mqtt.c | 4 ++-- src/output-json-mqtt.h | 2 +- src/output-json-pgsql.c | 4 ++-- src/output-json-pgsql.h | 2 +- src/output-json-tls.c | 2 +- src/output-json-tls.h | 2 +- src/output.c | 24 ++++++++++-------------- 19 files changed, 38 insertions(+), 42 deletions(-) diff --git a/src/app-layer-ftp.c b/src/app-layer-ftp.c index 06db8d5cb9..a8c0385a2d 100644 --- a/src/app-layer-ftp.c +++ b/src/app-layer-ftp.c @@ -1488,9 +1488,9 @@ uint16_t JsonGetNextLineFromBuffer(const char *buffer, const uint16_t len) return c == NULL ? len : (uint16_t)(c - buffer + 1); } -bool EveFTPDataAddMetadata(void *vtx, SCJsonBuilder *jb) +bool EveFTPDataAddMetadata(const void *vtx, void *jb) { - const FtpDataState *ftp_state = (FtpDataState *)vtx; + const FtpDataState *ftp_state = vtx; SCJbOpenObject(jb, "ftp_data"); if (ftp_state->file_name) { diff --git a/src/app-layer-ftp.h b/src/app-layer-ftp.h index cca55eae43..ddf8428585 100644 --- a/src/app-layer-ftp.h +++ b/src/app-layer-ftp.h @@ -131,6 +131,6 @@ uint64_t FTPMemuseGlobalCounter(void); uint64_t FTPMemcapGlobalCounter(void); uint16_t JsonGetNextLineFromBuffer(const char *buffer, const uint16_t len); -bool EveFTPDataAddMetadata(void *vtx, SCJsonBuilder *jb); +bool EveFTPDataAddMetadata(const void *vtx, void *jb); #endif /* SURICATA_APP_LAYER_FTP_H */ diff --git a/src/output-json-dnp3.c b/src/output-json-dnp3.c index 81f49df36c..e55c6c039e 100644 --- a/src/output-json-dnp3.c +++ b/src/output-json-dnp3.c @@ -193,7 +193,7 @@ static void JsonDNP3LogResponse(SCJsonBuilder *js, DNP3Transaction *dnp3tx) SCJbClose(js); } -bool AlertJsonDnp3(void *vtx, SCJsonBuilder *js) +bool AlertJsonDnp3(const void *vtx, void *js) { DNP3Transaction *tx = (DNP3Transaction *)vtx; if (tx->done && tx->buffer == NULL) { diff --git a/src/output-json-dnp3.h b/src/output-json-dnp3.h index 96472c0c5b..9272bd5aa6 100644 --- a/src/output-json-dnp3.h +++ b/src/output-json-dnp3.h @@ -21,6 +21,6 @@ #include "app-layer-dnp3.h" void JsonDNP3LogRegister(void); -bool AlertJsonDnp3(void *vtx, SCJsonBuilder *js); +bool AlertJsonDnp3(const void *vtx, void *js); #endif /* SURICATA_OUTPUT_JSON_DNP3_H */ diff --git a/src/output-json-dns.c b/src/output-json-dns.c index 76a6b62d27..96a60ddc46 100644 --- a/src/output-json-dns.c +++ b/src/output-json-dns.c @@ -248,26 +248,26 @@ typedef struct LogDnsLogThread_ { OutputJsonThreadCtx *ctx; } LogDnsLogThread; -bool AlertJsonDns(void *txptr, SCJsonBuilder *js) +bool AlertJsonDns(const void *txptr, void *js) { return SCDnsLogJson( txptr, LOG_FORMAT_DETAILED | LOG_QUERIES | LOG_ANSWERS | LOG_ALL_RRTYPES, js); } -bool AlertJsonDoh2(void *txptr, SCJsonBuilder *js) +bool AlertJsonDoh2(const void *txptr, void *js) { SCJsonBuilderMark mark = { 0, 0, 0 }; SCJbGetMark(js, &mark); // first log HTTP2 part - bool r = SCHttp2LogJson(txptr, js); + bool r = SCHttp2LogJson((void *)txptr, js); if (!r) { SCJbRestoreMark(js, &mark); } // then log one DNS tx if any, preferring the answer - void *tx_dns = DetectGetInnerTx(txptr, ALPROTO_DOH2, ALPROTO_DOH2, STREAM_TOCLIENT); + void *tx_dns = DetectGetInnerTx((void *)txptr, ALPROTO_DOH2, ALPROTO_DOH2, STREAM_TOCLIENT); if (tx_dns == NULL) { - tx_dns = DetectGetInnerTx(txptr, ALPROTO_DOH2, ALPROTO_DOH2, STREAM_TOSERVER); + tx_dns = DetectGetInnerTx((void *)txptr, ALPROTO_DOH2, ALPROTO_DOH2, STREAM_TOSERVER); } bool r2 = false; if (tx_dns) { diff --git a/src/output-json-dns.h b/src/output-json-dns.h index c15b80cd27..bd0265105e 100644 --- a/src/output-json-dns.h +++ b/src/output-json-dns.h @@ -27,7 +27,7 @@ void JsonDnsLogRegister(void); void JsonDoh2LogRegister(void); -bool AlertJsonDns(void *vtx, SCJsonBuilder *js); -bool AlertJsonDoh2(void *vtx, SCJsonBuilder *js); +bool AlertJsonDns(const void *vtx, void *js); +bool AlertJsonDoh2(const void *vtx, void *js); #endif /* SURICATA_OUTPUT_JSON_DNS_H */ diff --git a/src/output-json-ftp.c b/src/output-json-ftp.c index ce090353c2..6e50431307 100644 --- a/src/output-json-ftp.c +++ b/src/output-json-ftp.c @@ -44,9 +44,9 @@ #include "app-layer-ftp.h" #include "output-json-ftp.h" -bool EveFTPLogCommand(void *vtx, SCJsonBuilder *jb) +bool EveFTPLogCommand(const void *vtx, void *jb) { - FTPTransaction *tx = vtx; + const FTPTransaction *tx = vtx; /* Preallocate array objects to simplify failure case */ SCJsonBuilder *js_resplist = NULL; if (!TAILQ_EMPTY(&tx->response_list)) { diff --git a/src/output-json-ftp.h b/src/output-json-ftp.h index 2adf69fd6e..09757f7b6f 100644 --- a/src/output-json-ftp.h +++ b/src/output-json-ftp.h @@ -24,6 +24,6 @@ #ifndef SURICATA_OUTPUT_JSON_FTP_H #define SURICATA_OUTPUT_JSON_FTP_H -bool EveFTPLogCommand(void *vtx, SCJsonBuilder *js); +bool EveFTPLogCommand(const void *vtx, void *js); #endif /* SURICATA_OUTPUT_JSON_FTP_H */ diff --git a/src/output-json-llmnr.c b/src/output-json-llmnr.c index 0132262933..d674d02085 100644 --- a/src/output-json-llmnr.c +++ b/src/output-json-llmnr.c @@ -41,9 +41,9 @@ typedef struct LogLLMNRLogThread_ { OutputJsonThreadCtx *ctx; } SCLLMNRLogThread; -bool AlertJsonLLMNR(void *txptr, SCJsonBuilder *js) +bool AlertJsonLLMNR(const void *txptr, void *js) { - return SCLLMNRLogJson(txptr, js); + return SCLLMNRLogJson((void *)txptr, js); } static int JsonLLMNRLogger(ThreadVars *tv, void *thread_data, const Packet *p, Flow *f, diff --git a/src/output-json-llmnr.h b/src/output-json-llmnr.h index fbb0c99533..0aa189d281 100644 --- a/src/output-json-llmnr.h +++ b/src/output-json-llmnr.h @@ -21,6 +21,6 @@ #define SURICATA_OUTPUT_JSON_LLMNR_H void JsonLLMNRLogRegister(void); -bool AlertJsonLLMNR(void *txptr, SCJsonBuilder *js); +bool AlertJsonLLMNR(const void *txptr, void *js); #endif /* SURICATA_OUTPUT_JSON_LLMNR_H */ diff --git a/src/output-json-mdns.c b/src/output-json-mdns.c index bb1d45aba9..2ba896d7bb 100644 --- a/src/output-json-mdns.c +++ b/src/output-json-mdns.c @@ -39,7 +39,7 @@ typedef struct SCDnsLogThread_ { OutputJsonThreadCtx *ctx; } SCDnsLogThread; -bool AlertJsonMdns(void *txptr, SCJsonBuilder *js) +bool AlertJsonMdns(const void *txptr, void *js) { return SCMdnsLogJson(txptr, js); } diff --git a/src/output-json-mdns.h b/src/output-json-mdns.h index beeb42382a..e29fa1992f 100644 --- a/src/output-json-mdns.h +++ b/src/output-json-mdns.h @@ -19,6 +19,6 @@ #define SURICATA_OUTPUT_JSON_MDNS_H void JsonMdnsLogRegister(void); -bool AlertJsonMdns(void *txptr, SCJsonBuilder *js); +bool AlertJsonMdns(const void *txptr, void *js); #endif /* SURICATA_OUTPUT_JSON_MDNS_H */ diff --git a/src/output-json-mqtt.c b/src/output-json-mqtt.c index 48bb9361dc..66abf0420e 100644 --- a/src/output-json-mqtt.c +++ b/src/output-json-mqtt.c @@ -59,9 +59,9 @@ typedef struct LogMQTTLogThread_ { OutputJsonThreadCtx *ctx; } LogMQTTLogThread; -bool JsonMQTTAddMetadata(void *vtx, SCJsonBuilder *js) +bool JsonMQTTAddMetadata(const void *vtx, void *js) { - return SCMqttLoggerLog(vtx, MQTT_DEFAULT_FLAGS, MQTT_DEFAULT_MAXLOGLEN, js); + return SCMqttLoggerLog((void *)vtx, MQTT_DEFAULT_FLAGS, MQTT_DEFAULT_MAXLOGLEN, js); } static int JsonMQTTLogger(ThreadVars *tv, void *thread_data, diff --git a/src/output-json-mqtt.h b/src/output-json-mqtt.h index 2a862cc33f..536190b902 100644 --- a/src/output-json-mqtt.h +++ b/src/output-json-mqtt.h @@ -25,6 +25,6 @@ #define SURICATA_OUTPUT_JSON_MQTT_H void JsonMQTTLogRegister(void); -bool JsonMQTTAddMetadata(void *vtx, SCJsonBuilder *js); +bool JsonMQTTAddMetadata(const void *vtx, void *js); #endif /* SURICATA_OUTPUT_JSON_MQTT_H */ diff --git a/src/output-json-pgsql.c b/src/output-json-pgsql.c index 41979e2316..8d109d3c50 100644 --- a/src/output-json-pgsql.c +++ b/src/output-json-pgsql.c @@ -58,9 +58,9 @@ typedef struct LogPgsqlLogThread_ { OutputJsonThreadCtx *ctx; } LogPgsqlLogThread; -bool JsonPgsqlAddMetadata(void *vtx, SCJsonBuilder *jb) +bool JsonPgsqlAddMetadata(const void *vtx, void *jb) { - return SCPgsqlLogger(vtx, PGSQL_DEFAULTS, jb); + return SCPgsqlLogger((void *)vtx, PGSQL_DEFAULTS, jb); } static int JsonPgsqlLogger(ThreadVars *tv, void *thread_data, const Packet *p, Flow *f, void *state, diff --git a/src/output-json-pgsql.h b/src/output-json-pgsql.h index 3a3086d166..9fd0e7ddd4 100644 --- a/src/output-json-pgsql.h +++ b/src/output-json-pgsql.h @@ -25,6 +25,6 @@ #define SURICATA_OUTPUT_JSON_PGSQL_H void JsonPgsqlLogRegister(void); -bool JsonPgsqlAddMetadata(void *vtx, SCJsonBuilder *jb); +bool JsonPgsqlAddMetadata(const void *vtx, void *jb); #endif /* SURICATA_OUTPUT_JSON_PGSQL_H */ diff --git a/src/output-json-tls.c b/src/output-json-tls.c index 37299f6fb1..eb80a1603f 100644 --- a/src/output-json-tls.c +++ b/src/output-json-tls.c @@ -519,7 +519,7 @@ static void JsonTlsLogFields(SCJsonBuilder *js, SSLState *ssl_state, uint64_t fi } } -bool JsonTlsLogJSONExtended(void *vtx, SCJsonBuilder *tjs) +bool JsonTlsLogJSONExtended(const void *vtx, void *tjs) { SSLState *state = (SSLState *)vtx; SCJbOpenObject(tjs, "tls"); diff --git a/src/output-json-tls.h b/src/output-json-tls.h index 6d988957f1..5232f2b504 100644 --- a/src/output-json-tls.h +++ b/src/output-json-tls.h @@ -29,6 +29,6 @@ void JsonTlsLogRegister(void); /* For SCJsonBuilder. */ #include "rust.h" -bool JsonTlsLogJSONExtended(void *vtx, SCJsonBuilder *js); +bool JsonTlsLogJSONExtended(const void *vtx, void *js); #endif /* SURICATA_OUTPUT_JSON_TLS_H */ diff --git a/src/output.c b/src/output.c index 2645ffc637..651a6eb644 100644 --- a/src/output.c +++ b/src/output.c @@ -949,25 +949,23 @@ void OutputRegisterRootLoggers(void) FatalError("Failed to allocate simple_json_applayer_loggers"); } // ALPROTO_HTTP1 special: uses some options flags - RegisterSimpleJsonApplayerLogger(ALPROTO_FTP, (EveJsonSimpleTxLogFunc)EveFTPLogCommand, NULL); + RegisterSimpleJsonApplayerLogger(ALPROTO_FTP, EveFTPLogCommand, NULL); // ALPROTO_SMTP special: uses state - RegisterSimpleJsonApplayerLogger( - ALPROTO_TLS, (EveJsonSimpleTxLogFunc)JsonTlsLogJSONExtended, NULL); + RegisterSimpleJsonApplayerLogger(ALPROTO_TLS, JsonTlsLogJSONExtended, NULL); // no cast here but done in rust for SSHTransaction RegisterSimpleJsonApplayerLogger(ALPROTO_SSH, (EveJsonSimpleTxLogFunc)SCSshLogJson, NULL); // ALPROTO_SMB special: uses state // ALPROTO_DCERPC special: uses state - RegisterSimpleJsonApplayerLogger(ALPROTO_DNS, (EveJsonSimpleTxLogFunc)AlertJsonDns, NULL); - RegisterSimpleJsonApplayerLogger(ALPROTO_MDNS, (EveJsonSimpleTxLogFunc)AlertJsonMdns, NULL); - RegisterSimpleJsonApplayerLogger(ALPROTO_LLMNR, (EveJsonSimpleTxLogFunc)AlertJsonLLMNR, NULL); + RegisterSimpleJsonApplayerLogger(ALPROTO_DNS, AlertJsonDns, NULL); + RegisterSimpleJsonApplayerLogger(ALPROTO_MDNS, AlertJsonMdns, NULL); + RegisterSimpleJsonApplayerLogger(ALPROTO_LLMNR, AlertJsonLLMNR, NULL); // either need a cast here or in rust for ModbusTransaction, done here RegisterSimpleJsonApplayerLogger(ALPROTO_MODBUS, (EveJsonSimpleTxLogFunc)SCModbusToJson, NULL); RegisterSimpleJsonApplayerLogger(ALPROTO_ENIP, (EveJsonSimpleTxLogFunc)SCEnipLoggerLog, NULL); - RegisterSimpleJsonApplayerLogger(ALPROTO_DNP3, (EveJsonSimpleTxLogFunc)AlertJsonDnp3, NULL); + RegisterSimpleJsonApplayerLogger(ALPROTO_DNP3, AlertJsonDnp3, NULL); // ALPROTO_NFS special: uses state // underscore instead of dash for ftp_data - RegisterSimpleJsonApplayerLogger( - ALPROTO_FTPDATA, (EveJsonSimpleTxLogFunc)EveFTPDataAddMetadata, "ftp_data"); + RegisterSimpleJsonApplayerLogger(ALPROTO_FTPDATA, EveFTPDataAddMetadata, "ftp_data"); RegisterSimpleJsonApplayerLogger( ALPROTO_TFTP, (EveJsonSimpleTxLogFunc)SCTftpLogJsonRequest, NULL); // ALPROTO_IKE special: uses state @@ -978,14 +976,12 @@ void OutputRegisterRootLoggers(void) RegisterSimpleJsonApplayerLogger(ALPROTO_SIP, (EveJsonSimpleTxLogFunc)SCSipLogJson, NULL); RegisterSimpleJsonApplayerLogger(ALPROTO_RFB, (EveJsonSimpleTxLogFunc)SCRfbJsonLogger, NULL); RegisterSimpleJsonApplayerLogger(ALPROTO_POP3, (EveJsonSimpleTxLogFunc)SCPop3LoggerLog, NULL); - RegisterSimpleJsonApplayerLogger( - ALPROTO_MQTT, (EveJsonSimpleTxLogFunc)JsonMQTTAddMetadata, NULL); - RegisterSimpleJsonApplayerLogger( - ALPROTO_PGSQL, (EveJsonSimpleTxLogFunc)JsonPgsqlAddMetadata, NULL); + RegisterSimpleJsonApplayerLogger(ALPROTO_MQTT, JsonMQTTAddMetadata, NULL); + RegisterSimpleJsonApplayerLogger(ALPROTO_PGSQL, JsonPgsqlAddMetadata, NULL); RegisterSimpleJsonApplayerLogger( ALPROTO_WEBSOCKET, (EveJsonSimpleTxLogFunc)SCWebSocketLoggerLog, NULL); RegisterSimpleJsonApplayerLogger(ALPROTO_LDAP, (EveJsonSimpleTxLogFunc)SCLdapLoggerLog, NULL); - RegisterSimpleJsonApplayerLogger(ALPROTO_DOH2, (EveJsonSimpleTxLogFunc)AlertJsonDoh2, NULL); + RegisterSimpleJsonApplayerLogger(ALPROTO_DOH2, AlertJsonDoh2, NULL); RegisterSimpleJsonApplayerLogger( ALPROTO_TEMPLATE, (EveJsonSimpleTxLogFunc)SCTemplateLoggerLog, NULL); RegisterSimpleJsonApplayerLogger(ALPROTO_RDP, (EveJsonSimpleTxLogFunc)SCRdpToJson, NULL);