From: Victor Julien Date: Sun, 5 Apr 2020 14:56:35 +0000 (+0200) Subject: detect/pktvar: fix memory leaks X-Git-Tag: suricata-5.0.3~57 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1980e49d3444029697e920a7f5e17d4a7bc05d65;p=thirdparty%2Fsuricata.git detect/pktvar: fix memory leaks (cherry picked from commit aba4e195484a4ee2068ca13ed7852aab81f00d5a) --- diff --git a/src/detect-pktvar.c b/src/detect-pktvar.c index e2b4bd789a..fe43efb4fb 100644 --- a/src/detect-pktvar.c +++ b/src/detect-pktvar.c @@ -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; } - -