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

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