]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
cppcheck/detect: Address cppcheck memory leak
authorJeff Lucovsky <jlucovsky@oisf.net>
Sat, 25 Nov 2023 14:20:43 +0000 (09:20 -0500)
committerVictor Julien <victor@inliniac.net>
Thu, 29 Feb 2024 10:24:41 +0000 (11:24 +0100)
Issue: 6527

Ensure that the `map->string` memory isn't leaked following an error
return from `HashListTableAdd`

(cherry picked from commit 8b2fd434fc04ae84317d44d0a450af3ead9a157f)

src/detect-engine-address.c

index ac10e142dedc737efd7a99d0962de6df50a6cd23..f0d425b2bc76c9718b370d04596310581e038733 100644 (file)
@@ -1362,23 +1362,28 @@ void DetectAddressMapFree(DetectEngineCtx *de_ctx)
     return;
 }
 
-static int DetectAddressMapAdd(DetectEngineCtx *de_ctx, const char *string,
-                        DetectAddressHead *address, bool contains_negation)
+static bool DetectAddressMapAdd(DetectEngineCtx *de_ctx, const char *string,
+        DetectAddressHead *address, bool contains_negation)
 {
     DetectAddressMap *map = SCCalloc(1, sizeof(*map));
     if (map == NULL)
-        return -1;
+        return false;
 
     map->string = SCStrdup(string);
     if (map->string == NULL) {
         SCFree(map);
-        return -1;
+        return false;
     }
     map->address = address;
     map->contains_negation = contains_negation;
 
-    BUG_ON(HashListTableAdd(de_ctx->address_table, (void *)map, 0) != 0);
-    return 0;
+    if (HashListTableAdd(de_ctx->address_table, (void *)map, 0) != 0) {
+        SCFree(map->string);
+        SCFree(map);
+        return false;
+    }
+
+    return true;
 }
 
 static const DetectAddressMap *DetectAddressMapLookup(DetectEngineCtx *de_ctx,
@@ -1471,8 +1476,11 @@ const DetectAddressHead *DetectParseAddress(DetectEngineCtx *de_ctx,
         *contains_negation = false;
     }
 
-    DetectAddressMapAdd((DetectEngineCtx *)de_ctx, string, head,
-            *contains_negation);
+    if (!DetectAddressMapAdd((DetectEngineCtx *)de_ctx, string, head, *contains_negation)) {
+        DetectAddressHeadFree(head);
+        return NULL;
+    }
+
     return head;
 }