From 1aef998b812fd21933b322900b30971649c31d48 Mon Sep 17 00:00:00 2001 From: Markus Sunela <30700548+makusuko@users.noreply.github.com> Date: Thu, 2 May 2019 16:35:55 +0300 Subject: [PATCH] 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. --- src/rules.c | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/src/rules.c b/src/rules.c index d0addb8..7ee4d8a 100644 --- a/src/rules.c +++ b/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); }