]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
detect/pktvar: fix memory leaks
authorVictor Julien <victor@inliniac.net>
Sun, 5 Apr 2020 14:56:35 +0000 (16:56 +0200)
committerJeff Lucovsky <jeff@lucovsky.org>
Wed, 8 Apr 2020 12:42:54 +0000 (08:42 -0400)
(cherry picked from commit aba4e195484a4ee2068ca13ed7852aab81f00d5a)

src/detect-pktvar.c

index e2b4bd789af3e82411deb1f66ff1717bf31de3be..fe43efb4fbf8724ba18b9be5b331bb63a7bba00b 100644 (file)
@@ -43,13 +43,14 @@ static pcre_extra *parse_regex_study;
 static int DetectPktvarMatch (DetectEngineThreadCtx *, Packet *,
         const Signature *, const SigMatchCtx *);
 static int DetectPktvarSetup (DetectEngineCtx *, Signature *, const char *);
+static void DetectPktvarFree(void *data);
 
 void DetectPktvarRegister (void)
 {
     sigmatch_table[DETECT_PKTVAR].name = "pktvar";
     sigmatch_table[DETECT_PKTVAR].Match = DetectPktvarMatch;
     sigmatch_table[DETECT_PKTVAR].Setup = DetectPktvarSetup;
-    sigmatch_table[DETECT_PKTVAR].Free  = NULL;
+    sigmatch_table[DETECT_PKTVAR].Free  = DetectPktvarFree;
     sigmatch_table[DETECT_PKTVAR].RegisterTests  = NULL;
 
     DetectSetupParseRegexes(PARSE_REGEX, &parse_regex, &parse_regex_study);
@@ -77,6 +78,15 @@ static int DetectPktvarMatch (DetectEngineThreadCtx *det_ctx, Packet *p,
     return ret;
 }
 
+static void DetectPktvarFree(void *ptr)
+{
+    DetectPktvarData *data = ptr;
+    if (data != NULL) {
+        SCFree(data->content);
+        SCFree(data);
+    }
+}
+
 static int DetectPktvarSetup (DetectEngineCtx *de_ctx, Signature *s, const char *rawstr)
 {
     char *varname = NULL, *varcontent = NULL;
@@ -102,6 +112,7 @@ static int DetectPktvarSetup (DetectEngineCtx *de_ctx, Signature *s, const char
 
     res = pcre_get_substring((char *)rawstr, ov, MAX_SUBSTRINGS, 2, &str_ptr);
     if (res < 0) {
+        pcre_free(varname);
         SCLogError(SC_ERR_PCRE_GET_SUBSTRING, "pcre_get_substring failed");
         return -1;
     }
@@ -125,11 +136,11 @@ static int DetectPktvarSetup (DetectEngineCtx *de_ctx, Signature *s, const char
         pcre_free(varcontent);
         return -1;
     }
+    pcre_free(varcontent);
 
     DetectPktvarData *cd = SCCalloc(1, sizeof(DetectPktvarData));
     if (unlikely(cd == NULL)) {
         pcre_free(varname);
-        pcre_free(varcontent);
         SCFree(content);
         return -1;
     }
@@ -138,14 +149,12 @@ static int DetectPktvarSetup (DetectEngineCtx *de_ctx, Signature *s, const char
     cd->content_len = len;
     cd->id = VarNameStoreSetupAdd(varname, VAR_TYPE_PKT_VAR);
     pcre_free(varname);
-    pcre_free(varcontent);
 
     /* Okay so far so good, lets get this into a SigMatch
      * and put it in the Signature. */
     SigMatch *sm = SigMatchAlloc();
     if (unlikely(sm == NULL)) {
-        SCFree(cd->content);
-        SCFree(cd);
+        DetectPktvarFree(cd);
         return -1;
     }
     sm->type = DETECT_PKTVAR;
@@ -154,5 +163,3 @@ static int DetectPktvarSetup (DetectEngineCtx *de_ctx, Signature *s, const char
     SigMatchAppendSMToList(s, sm, DETECT_SM_LIST_MATCH);
     return 0;
 }
-
-