From: Philippe Antoine Date: Mon, 11 Sep 2023 14:49:48 +0000 (+0200) Subject: mime: avoid quadratic complexity in MimeDecAddEntity X-Git-Tag: suricata-6.0.15~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=62b3bb0d5ed9a4aedc9b8007ff9d5971ca5b0b56;p=thirdparty%2Fsuricata.git mime: avoid quadratic complexity in MimeDecAddEntity Ticket: #6306 Keep a reference to last child, consume a bit more RAM to save CPU (cherry picked from commit 737bc4f219ea36b4da4ffbebef15b0619dffbca1) --- diff --git a/src/util-decode-mime.c b/src/util-decode-mime.c index 50f12e0f1f..69065f2794 100644 --- a/src/util-decode-mime.c +++ b/src/util-decode-mime.c @@ -390,7 +390,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; } @@ -400,12 +400,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 021a79a14a..abbbe8cd43 100644 --- a/src/util-decode-mime.h +++ b/src/util-decode-mime.h @@ -145,6 +145,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; /**