Fixed NULL pointer error, if no label is provided after the rule keyword.
Add NULL guard in freerules function. Use strncat and strncpy to ensure the buffer lengths are adhered to.
This commit is contained in:
committed by
Markus Sunela
parent
d3e989b621
commit
1aef998b81
34
src/rules.c
34
src/rules.c
@@ -110,6 +110,10 @@ void initrules(Project *pr)
|
||||
//--------------------------------------------------------------
|
||||
{
|
||||
pr->rules.RuleState = r_PRIORITY;
|
||||
pr->rules.LastPremise = NULL;
|
||||
pr->rules.LastThenAction = NULL;
|
||||
pr->rules.LastElseAction = NULL;
|
||||
pr->rules.ActionList = NULL;
|
||||
pr->network.Rule = NULL;
|
||||
}
|
||||
|
||||
@@ -169,8 +173,14 @@ void freerules(Project *pr)
|
||||
//--------------------------------------------------------------
|
||||
{
|
||||
int i;
|
||||
|
||||
// Already freed
|
||||
if (pr->network.Rule == NULL)
|
||||
return;
|
||||
|
||||
for (i = 1; i <= pr->network.Nrules; i++) clearrule(pr, i);
|
||||
free(pr->network.Rule);
|
||||
pr->network.Rule = NULL;
|
||||
}
|
||||
|
||||
int ruledata(Project *pr)
|
||||
@@ -199,6 +209,12 @@ int ruledata(Project *pr)
|
||||
break;
|
||||
|
||||
case r_RULE:
|
||||
// Missing the rule label
|
||||
if (parser->Ntokens != 2)
|
||||
{
|
||||
err = 201;
|
||||
break;
|
||||
}
|
||||
net->Nrules++;
|
||||
newrule(pr);
|
||||
rules->RuleState = r_RULE;
|
||||
@@ -302,24 +318,24 @@ void ruleerrmsg(Project *pr)
|
||||
// Get label of rule being parsed
|
||||
if (net->Nrules > 0)
|
||||
{
|
||||
strcpy(label, t_RULE);
|
||||
strcat(label, " ");
|
||||
strcat(label, net->Rule[net->Nrules].label);
|
||||
strncpy(label, t_RULE, MAXMSG);
|
||||
strncat(label, " ", MAXMSG);
|
||||
strncat(label, net->Rule[net->Nrules].label, MAXMSG);
|
||||
}
|
||||
else strcpy(label, t_RULES_SECT);
|
||||
else strncpy(label, t_RULES_SECT, MAXMSG);
|
||||
|
||||
// Write rule label and error message to status report
|
||||
sprintf(pr->Msg, "%s", msg);
|
||||
strcat(pr->Msg, label);
|
||||
strcat(pr->Msg, ":");
|
||||
snprintf(pr->Msg, MAXMSG, "%s", msg);
|
||||
strncat(pr->Msg, label, MAXMSG);
|
||||
strncat(pr->Msg, ":", MAXMSG);
|
||||
writeline(pr, pr->Msg);
|
||||
|
||||
// Write text of rule clause being parsed to status report
|
||||
strcpy(msg, Tok[0]);
|
||||
for (i = 1; i < parser->Ntokens; i++)
|
||||
{
|
||||
strcat(msg, " ");
|
||||
strcat(msg, Tok[i]);
|
||||
strncat(msg, " ", MAXLINE);
|
||||
strncat(msg, Tok[i], MAXLINE);
|
||||
}
|
||||
writeline(pr, msg);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user