Blame SOURCES/0163-filter_qualify-free-allocated-data-on-the-error-path.patch

da51ba
From a034f8a50cbe15d250457ed2eefbf9db059f724f Mon Sep 17 00:00:00 2001
da51ba
From: Eugene Syromyatnikov <evgsyr@gmail.com>
da51ba
Date: Wed, 18 Aug 2021 21:48:38 +0200
da51ba
Subject: [PATCH 147/150] filter_qualify: free allocated data on the error path
da51ba
 exit of parse_poke_token
da51ba
da51ba
While not terribly required due to the fact that issues with option
da51ba
parsing lead to program termination, these changes avoid leaking data
da51ba
allocated in the function's scope and not stored elsewhere, which might
da51ba
come handy if it ever be used dynamically during the runtime.
da51ba
da51ba
This also has been reported as resource leaks by covscan, and these
da51ba
changes should calm it.
da51ba
da51ba
* src/filter_qualify.c (parse_poke_token): Go to err label instead of
da51ba
returning right away; free poke->data, poke, and str_tokenized before
da51ba
returning false.
da51ba
da51ba
References: https://bugzilla.redhat.com/show_bug.cgi?id=1995509
da51ba
---
da51ba
 src/filter_qualify.c | 18 ++++++++++++------
da51ba
 1 file changed, 12 insertions(+), 6 deletions(-)
da51ba
da51ba
diff --git a/src/filter_qualify.c b/src/filter_qualify.c
da51ba
index df05496..a1a6471 100644
da51ba
--- a/src/filter_qualify.c
da51ba
+++ b/src/filter_qualify.c
da51ba
@@ -169,34 +169,40 @@ parse_poke_token(const char *input, struct inject_opts *fopts, bool isenter)
da51ba
 		poke->is_enter = isenter;
da51ba
 
da51ba
 		if ((val = STR_STRIP_PREFIX(token, "@arg")) == token)
da51ba
-			return false;
da51ba
+			goto err;
da51ba
 		if ((val[0] >= '1') && (val[0] <= '7')) {
da51ba
 			poke->arg_no = val[0] - '0';
da51ba
 		} else {
da51ba
-			return false;
da51ba
+			goto err;
da51ba
 		}
da51ba
 		if (val[1] != '=')
da51ba
-			return false;
da51ba
+			goto err;
da51ba
 		val += 2;
da51ba
 
da51ba
 		data_len = strlen(val);
da51ba
 		if ((data_len == 0) || (data_len % 2) || (data_len > 2048))
da51ba
-			return false;
da51ba
+			goto err;
da51ba
 		data_len /= 2;
da51ba
 		poke->data_len = data_len;
da51ba
 		poke->data = xmalloc(data_len);
da51ba
 
da51ba
 		for (size_t i = 0; i < data_len; i++)
da51ba
 			if (sscanf(&val[2 * i], "%2hhx", &poke->data[i]) != 1)
da51ba
-				return false;
da51ba
+				goto err;
da51ba
 
da51ba
 		if (poke_add(fopts->data.poke_idx, poke))
da51ba
-			return false;
da51ba
+			goto err;
da51ba
 	}
da51ba
 	free(str_tokenized);
da51ba
 
da51ba
 	fopts->data.flags |= flag;
da51ba
 	return true;
da51ba
+
da51ba
+err:
da51ba
+	free(poke->data);
da51ba
+	free(poke);
da51ba
+	free(str_tokenized);
da51ba
+	return false;
da51ba
 }
da51ba
 
da51ba
 static bool
da51ba
-- 
da51ba
2.1.4
da51ba