From: Philippe Antoine Date: Tue, 17 Jun 2025 08:35:55 +0000 (+0200) Subject: mpm: allocate StateQueue on the heap for ks X-Git-Tag: suricata-7.0.11~20 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e4cf0b22cd381bae72d800ce89a980e4e17331d1;p=thirdparty%2Fsuricata.git mpm: allocate StateQueue on the heap for ks Completes commit 92fce2fdc069324e6060ce046ca80da6a351573c Ticket: 6264 (cherry picked from commit 330cff94e86ee3be8ced0ad4ed7bde3999f795e9) --- diff --git a/src/util-mpm-ac-ks.c b/src/util-mpm-ac-ks.c index 9b2ab07d32..e6d0f67ff1 100644 --- a/src/util-mpm-ac-ks.c +++ b/src/util-mpm-ac-ks.c @@ -402,7 +402,7 @@ static void SCACTileCreateGotoTable(MpmCtx *mpm_ctx) } } -static inline int SCACTileStateQueueIsEmpty(StateQueue *q) +static inline int SCACStateQueueIsEmpty(StateQueue *q) { if (q->top == q->bot) return 1; @@ -410,7 +410,7 @@ static inline int SCACTileStateQueueIsEmpty(StateQueue *q) return 0; } -static inline void SCACTileEnqueue(StateQueue *q, int32_t state) +static inline void SCACEnqueue(StateQueue *q, int32_t state) { int i = 0; @@ -431,7 +431,7 @@ static inline void SCACTileEnqueue(StateQueue *q, int32_t state) } } -static inline int32_t SCACTileDequeue(StateQueue *q) +static inline int32_t SCACDequeue(StateQueue *q) { if (q->bot == STATE_QUEUE_CONTAINER_SIZE) q->bot = 0; @@ -506,8 +506,10 @@ static void SCACTileCreateFailureTable(MpmCtx *mpm_ctx) int32_t state = 0; int32_t r_state = 0; - StateQueue q; - memset(&q, 0, sizeof(StateQueue)); + StateQueue *q = SCCalloc(1, sizeof(StateQueue)); + if (q == NULL) { + FatalError("Error allocating memory"); + } /* Allocate space for the failure table. A failure entry in the table for * every state(SCACTileCtx->state_count) */ @@ -523,19 +525,19 @@ static void SCACTileCreateFailureTable(MpmCtx *mpm_ctx) for (aa = 0; aa < ctx->alphabet_size; aa++) { int32_t temp_state = ctx->goto_table[0][aa]; if (temp_state != 0) { - SCACTileEnqueue(&q, temp_state); + SCACEnqueue(q, temp_state); ctx->failure_table[temp_state] = 0; } } - while (!SCACTileStateQueueIsEmpty(&q)) { + while (!SCACStateQueueIsEmpty(q)) { /* pick up every state from the queue and add failure transitions */ - r_state = SCACTileDequeue(&q); + r_state = SCACDequeue(q); for (aa = 0; aa < ctx->alphabet_size; aa++) { int32_t temp_state = ctx->goto_table[r_state][aa]; if (temp_state == SC_AC_TILE_FAIL) continue; - SCACTileEnqueue(&q, temp_state); + SCACEnqueue(q, temp_state); state = ctx->failure_table[r_state]; while(ctx->goto_table[state][aa] == SC_AC_TILE_FAIL) @@ -545,6 +547,7 @@ static void SCACTileCreateFailureTable(MpmCtx *mpm_ctx) mpm_ctx); } } + SCFree(q); } /* @@ -678,28 +681,31 @@ static inline void SCACTileCreateDeltaTable(MpmCtx *mpm_ctx) ctx->alphabet_storage = 256; /* Change? */ } - StateQueue q; - memset(&q, 0, sizeof(StateQueue)); + StateQueue *q = SCCalloc(1, sizeof(StateQueue)); + if (q == NULL) { + FatalError("Error allocating memory"); + } for (aa = 0; aa < ctx->alphabet_size; aa++) { int temp_state = ctx->goto_table[0][aa]; if (temp_state != 0) - SCACTileEnqueue(&q, temp_state); + SCACEnqueue(q, temp_state); } - while (!SCACTileStateQueueIsEmpty(&q)) { - r_state = SCACTileDequeue(&q); + while (!SCACStateQueueIsEmpty(q)) { + r_state = SCACDequeue(q); for (aa = 0; aa < ctx->alphabet_size; aa++) { int temp_state = ctx->goto_table[r_state][aa]; if (temp_state != SC_AC_TILE_FAIL) { - SCACTileEnqueue(&q, temp_state); + SCACEnqueue(q, temp_state); } else { int f_state = ctx->failure_table[r_state]; ctx->goto_table[r_state][aa] = ctx->goto_table[f_state][aa]; } } } + SCFree(q); } static void SCACTileClubOutputStatePresenceWithDeltaTable(MpmCtx *mpm_ctx)