From b3eca30011cf36ce595dfd905450d33809a45e72 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonathan=20Sch=C3=B6bel?= <jonathan@xn--schbel-yxa.info>
Date: Wed, 3 Apr 2024 10:03:27 +0200
Subject: [PATCH] Grammar: fix rule_add

The allocated memory wasn't freed in case of an error. Also the wrong
constant has been used, which happens to be the same.
---
 gsat.geany        |  2 +-
 src/lib/grammar.c | 19 +++++++++++++++----
 2 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/gsat.geany b/gsat.geany
index 9bcc78f..5dc7bf7 100644
--- a/gsat.geany
+++ b/gsat.geany
@@ -40,7 +40,7 @@ FILE_NAME_7=937;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprg
 FILE_NAME_8=909;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fsrc%2Flib%2Fstatus.h;0;8
 FILE_NAME_9=3758;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fsrc%2Flib%2Flog.c;0;8
 FILE_NAME_10=1373;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fsrc%2Flib%2Flog.h;0;8
-FILE_NAME_11=22090;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fsrc%2Flib%2Fgrammar.c;0;8
+FILE_NAME_11=19166;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fsrc%2Flib%2Fgrammar.c;0;8
 FILE_NAME_12=6103;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fsrc%2Flib%2Fgrammar.h;0;8
 FILE_NAME_13=6482;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fsrc%2Flib%2Ffile.c;0;8
 FILE_NAME_14=1457;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDocuments%2Fprojects%2Fprgm%2Flanguage%2FGSAT%2Fsrc%2Flib%2Ffile.h;0;8
diff --git a/src/lib/grammar.c b/src/lib/grammar.c
index de78082..a686f52 100644
--- a/src/lib/grammar.c
+++ b/src/lib/grammar.c
@@ -866,7 +866,7 @@ add_rule (struct GR_Grammar * grammar, struct rule_info rule,
 	< grammar->rule_n)
 	{
 		set_status (status, E_DOMAIN, 2, "too many rules");
-		return SYMBOL_ERR;
+		return RULE_ERR;
 	}
 
 	new_rules = realloc (grammar->rules, sizeof (struct rule_info)
@@ -874,7 +874,7 @@ add_rule (struct GR_Grammar * grammar, struct rule_info rule,
 	if (NULL == new_rules)
 	{
 		set_status (status, E_ALLOC, 3, "realloc failed");
-		return SYMBOL_ERR;
+		return RULE_ERR;
 	}
 
 	grammar->rules = new_rules;
@@ -934,7 +934,13 @@ GR_Grammar_add_rule (struct GR_Grammar * grammar,
 		return RULE_ERR;
 	}
 
-	return add_rule (grammar, rule_data, status);
+	if (RULE_ERR == add_rule (grammar, rule_data, status))
+	{
+		Rule_free (&rule_data.rule);
+		return RULE_ERR;
+	}
+
+	return rule_data.id;
 }
 
 rule_t
@@ -965,10 +971,15 @@ GR_Grammar_raw_add_rule (struct GR_Grammar * grammar,
 
 	Rule_move (&rule_data.rule, rule);
 
+	if (RULE_ERR == add_rule (grammar, rule_data, status))
+	{
+		return RULE_ERR;
+	}
+
 	/* let the caller reuse the rule */
 	Rule_init (rule);
 
-	return add_rule (grammar, rule_data, status);
+	return rule_data.id;
 }
 
 /*@null@*/
-- 
GitLab