From 737bc4f219ea36b4da4ffbebef15b0619dffbca1 Mon Sep 17 00:00:00 2001 From: Philippe Antoine Date: Mon, 11 Sep 2023 16:49:48 +0200 Subject: [PATCH] mime: avoid quadratic complexity in MimeDecAddEntity Ticket: #6306 Keep a reference to last child, consume a bit more RAM to save CPU --- src/util-decode-mime.c | 10 ++++------ src/util-decode-mime.h | 1 + 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/util-decode-mime.c b/src/util-decode-mime.c index 8e8b426c44..5e7a8d5713 100644 --- a/src/util-decode-mime.c +++ b/src/util-decode-mime.c @@ -384,7 +384,7 @@ static MimeDecUrl * MimeDecAddUrl(MimeDecEntity *entity, uint8_t *url, uint32_t */ MimeDecEntity * MimeDecAddEntity(MimeDecEntity *parent) { - MimeDecEntity *curr, *node = SCMalloc(sizeof(MimeDecEntity)); + MimeDecEntity *node = SCMalloc(sizeof(MimeDecEntity)); if (unlikely(node == NULL)) { return NULL; } @@ -394,12 +394,10 @@ MimeDecEntity * MimeDecAddEntity(MimeDecEntity *parent) if (parent != NULL) { if (parent->child == NULL) { parent->child = node; + parent->last_child = node; } else { - curr = parent->child; - while (curr->next != NULL) { - curr = curr->next; - } - curr->next = node; + parent->last_child->next = node; + parent->last_child = node; } } diff --git a/src/util-decode-mime.h b/src/util-decode-mime.h index 0dde13ca04..cc79d98a6e 100644 --- a/src/util-decode-mime.h +++ b/src/util-decode-mime.h @@ -144,6 +144,7 @@ typedef struct MimeDecEntity { uint8_t *msg_id; /**< Quick access pointer to message Id */ struct MimeDecEntity *next; /**< Pointer to list of sibling entities */ struct MimeDecEntity *child; /**< Pointer to list of child entities */ + struct MimeDecEntity *last_child; /**< Pointer to tail of the list of child entities */ } MimeDecEntity; /**