From 2481f2102b4b1e1d41890e91172c16f458eac93a Mon Sep 17 00:00:00 2001 From: Victor Julien Date: Tue, 26 Jan 2010 10:31:36 +0100 Subject: [PATCH] Add missing return value evaluation in port parsing and fix broken unittest. --- src/detect-engine-port.c | 29 ++++++++++++++++++++++------- src/detect-parse.c | 13 +++++++++---- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/detect-engine-port.c b/src/detect-engine-port.c index ae03dd5822..934ad3fee5 100644 --- a/src/detect-engine-port.c +++ b/src/detect-engine-port.c @@ -991,6 +991,7 @@ static int DetectPortParseDo(DetectPort **head, DetectPort **nhead, char *s, char address[1024] = ""; char *rule_var_port = NULL; char *temp_rule_var_port = NULL; + int r = 0; SCLogDebug("head %p, *head %p, negate %d", head, *head, negate); @@ -1020,7 +1021,10 @@ static int DetectPortParseDo(DetectPort **head, DetectPort **nhead, char *s, SCLogDebug("Parsed port from DetectPortParseDo - %s", address); x = 0; - DetectPortParseDo(head, nhead, address, negate? negate: n_set); + r = DetectPortParseDo(head, nhead, address, negate? negate: n_set); + if (r == -1) + goto error; + n_set = 0; } depth--; @@ -1045,8 +1049,11 @@ static int DetectPortParseDo(DetectPort **head, DetectPort **nhead, char *s, snprintf(temp_rule_var_port, strlen(rule_var_port) + 3, "[%s]", rule_var_port); } - DetectPortParseDo(head, nhead, temp_rule_var_port, + r = DetectPortParseDo(head, nhead, temp_rule_var_port, (negate + n_set) % 2);//negate? negate: n_set); + if (r == -1) + goto error; + d_set = 0; n_set = 0; if (temp_rule_var_port != rule_var_port) @@ -1056,10 +1063,13 @@ static int DetectPortParseDo(DetectPort **head, DetectPort **nhead, char *s, SCLogDebug("Parsed port from DetectPortParseDo - %s", address); if (negate == 0 && n_set == 0) { - DetectPortParseInsertString(head, address); + r = DetectPortParseInsertString(head, address); } else { - DetectPortParseInsertString(nhead, address); + r = DetectPortParseInsertString(nhead, address); } + if (r == -1) + goto error; + n_set = 0; } x = 0; @@ -1086,17 +1096,22 @@ static int DetectPortParseDo(DetectPort **head, DetectPort **nhead, char *s, snprintf(temp_rule_var_port, strlen(rule_var_port) + 3, "[%s]", rule_var_port); } - DetectPortParseDo(head, nhead, temp_rule_var_port, + r = DetectPortParseDo(head, nhead, temp_rule_var_port, (negate + n_set) % 2); + if (r == -1) + goto error; + d_set = 0; if (temp_rule_var_port != rule_var_port) free(temp_rule_var_port); } else { if (!((negate + n_set) % 2)) { - DetectPortParseInsertString(head,address); + r = DetectPortParseInsertString(head,address); } else { - DetectPortParseInsertString(nhead,address); + r = DetectPortParseInsertString(nhead,address); } + if (r == -1) + goto error; } n_set = 0; } diff --git a/src/detect-parse.c b/src/detect-parse.c index 6de5a5239f..7281882fed 100644 --- a/src/detect-parse.c +++ b/src/detect-parse.c @@ -603,6 +603,8 @@ void SigFree(Signature *s) { * \retval Pointer to the Signature instance on success; NULL on failure */ Signature *SigInit(DetectEngineCtx *de_ctx, char *sigstr) { + SCEnter(); + Signature *sig = SigAlloc(); if (sig == NULL) goto error; @@ -685,7 +687,7 @@ Signature *SigInit(DetectEngineCtx *de_ctx, char *sigstr) { sig->id, sig->flags & SIG_FLAG_APPLAYER ? "set" : "not set", sig->flags & SIG_FLAG_PACKET ? "set" : "not set"); - return sig; + SCReturnPtr(sig, "Signature"); error: if ( sig != NULL ) SigFree(sig); @@ -693,7 +695,7 @@ error: SCLogError(SC_ERR_INVALID_SIGNATURE,"Signature parsing failed: \"%s\"", sigstr); exit(EXIT_FAILURE); } - return NULL; + SCReturnPtr(NULL,"Signature"); } /** @@ -998,7 +1000,7 @@ end: /** \test Port validation */ int SigParseTest05 (void) { - int result = 1; + int result = 0; Signature *sig = NULL; DetectEngineCtx *de_ctx = DetectEngineCtxInit(); @@ -1006,8 +1008,11 @@ int SigParseTest05 (void) { goto end; sig = SigInit(de_ctx, "alert tcp 1.2.3.4 1024:65536 -> !1.2.3.4 any (msg:\"SigParseTest05\"; sid:1;)"); - if (sig != NULL) + if (sig == NULL) { result = 1; + } else { + printf("signature didn't fail to parse as we expected: "); + } end: if (sig != NULL) SigFree(sig);