port parsing: improve memory handling

pull/699/head
Victor Julien 12 years ago
parent b79b2fff25
commit 90cf8d4c6e

@ -1013,7 +1013,6 @@ static int DetectPortParseDo(DetectPort **head, DetectPort **nhead, char *s,
size_t size = strlen(s); size_t size = strlen(s);
char address[1024] = ""; char address[1024] = "";
char *rule_var_port = NULL; char *rule_var_port = NULL;
char *temp_rule_var_port = NULL;
int r = 0; int r = 0;
SCLogDebug("head %p, *head %p, negate %d", head, *head, negate); SCLogDebug("head %p, *head %p, negate %d", head, *head, negate);
@ -1056,6 +1055,9 @@ static int DetectPortParseDo(DetectPort **head, DetectPort **nhead, char *s,
if (o_set == 1) { if (o_set == 1) {
o_set = 0; o_set = 0;
} else if (d_set == 1) { } else if (d_set == 1) {
char *temp_rule_var_port = NULL,
*alloc_rule_var_port = NULL;
address[x - 1] = '\0'; address[x - 1] = '\0';
rule_var_port = SCRuleVarsGetConfVar(address, rule_var_port = SCRuleVarsGetConfVar(address,
@ -1071,11 +1073,12 @@ static int DetectPortParseDo(DetectPort **head, DetectPort **nhead, char *s,
} }
temp_rule_var_port = rule_var_port; temp_rule_var_port = rule_var_port;
if (negate == 1 || n_set == 1) { if (negate == 1 || n_set == 1) {
temp_rule_var_port = SCMalloc(strlen(rule_var_port) + 3); alloc_rule_var_port = SCMalloc(strlen(rule_var_port) + 3);
if (unlikely(temp_rule_var_port == NULL)) if (unlikely(alloc_rule_var_port == NULL))
goto error; goto error;
snprintf(temp_rule_var_port, strlen(rule_var_port) + 3, snprintf(alloc_rule_var_port, strlen(rule_var_port) + 3,
"[%s]", rule_var_port); "[%s]", rule_var_port);
temp_rule_var_port = alloc_rule_var_port;
} }
r = DetectPortParseDo(head, nhead, temp_rule_var_port, r = DetectPortParseDo(head, nhead, temp_rule_var_port,
(negate + n_set) % 2);//negate? negate: n_set); (negate + n_set) % 2);//negate? negate: n_set);
@ -1084,8 +1087,8 @@ static int DetectPortParseDo(DetectPort **head, DetectPort **nhead, char *s,
d_set = 0; d_set = 0;
n_set = 0; n_set = 0;
if (temp_rule_var_port != rule_var_port) if (alloc_rule_var_port != NULL)
SCFree(temp_rule_var_port); SCFree(alloc_rule_var_port);
} else { } else {
address[x - 1] = '\0'; address[x - 1] = '\0';
SCLogDebug("Parsed port from DetectPortParseDo - %s", address); SCLogDebug("Parsed port from DetectPortParseDo - %s", address);
@ -1114,6 +1117,9 @@ static int DetectPortParseDo(DetectPort **head, DetectPort **nhead, char *s,
SCLogDebug("%s", address); SCLogDebug("%s", address);
x = 0; x = 0;
if (d_set == 1) { if (d_set == 1) {
char *temp_rule_var_port = NULL,
*alloc_rule_var_port = NULL;
rule_var_port = SCRuleVarsGetConfVar(address, rule_var_port = SCRuleVarsGetConfVar(address,
SC_RULE_VARS_PORT_GROUPS); SC_RULE_VARS_PORT_GROUPS);
if (rule_var_port == NULL) if (rule_var_port == NULL)
@ -1127,11 +1133,12 @@ static int DetectPortParseDo(DetectPort **head, DetectPort **nhead, char *s,
} }
temp_rule_var_port = rule_var_port; temp_rule_var_port = rule_var_port;
if ((negate + n_set) % 2) { if ((negate + n_set) % 2) {
temp_rule_var_port = SCMalloc(strlen(rule_var_port) + 3); alloc_rule_var_port = SCMalloc(strlen(rule_var_port) + 3);
if (unlikely(temp_rule_var_port == NULL)) if (unlikely(alloc_rule_var_port == NULL))
goto error; goto error;
snprintf(temp_rule_var_port, strlen(rule_var_port) + 3, snprintf(alloc_rule_var_port, strlen(rule_var_port) + 3,
"[%s]", rule_var_port); "[%s]", rule_var_port);
temp_rule_var_port = alloc_rule_var_port;
} }
r = DetectPortParseDo(head, nhead, temp_rule_var_port, r = DetectPortParseDo(head, nhead, temp_rule_var_port,
(negate + n_set) % 2); (negate + n_set) % 2);
@ -1139,8 +1146,8 @@ static int DetectPortParseDo(DetectPort **head, DetectPort **nhead, char *s,
goto error; goto error;
d_set = 0; d_set = 0;
if (temp_rule_var_port != rule_var_port) if (alloc_rule_var_port != NULL)
SCFree(temp_rule_var_port); SCFree(alloc_rule_var_port);
} else { } else {
if (!((negate + n_set) % 2)) { if (!((negate + n_set) % 2)) {
r = DetectPortParseInsertString(head,address); r = DetectPortParseInsertString(head,address);

Loading…
Cancel
Save