Blame SOURCES/e2fsprogs-1.45.6-debugfs-fix-memory-allocation-failures-when-parsing-.patch

e427d2
From b31f493cadc92023056a096d0281957c49fca22c Mon Sep 17 00:00:00 2001
e427d2
From: Theodore Ts'o <tytso@mit.edu>
e427d2
Date: Fri, 12 Feb 2021 21:43:00 -0500
e427d2
Subject: [PATCH 19/46] debugfs: fix memory allocation failures when parsing
e427d2
 journal_write arguments
e427d2
Content-Type: text/plain
e427d2
e427d2
Fix double-free issues when parsing an invalid journal_write command,
e427d2
such as: "journal_write -b 12 -b BAD -b 42".
e427d2
e427d2
Addresses-Coverity-Bug: 1464571
e427d2
Addresses-Coverity-Bug: 1464575
e427d2
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
e427d2
Signed-off-by: Lukas Czerner <lczerner@redhat.com>
e427d2
---
e427d2
 debugfs/do_journal.c |  8 ++++++--
e427d2
 debugfs/util.c       | 15 +++++++--------
e427d2
 2 files changed, 13 insertions(+), 10 deletions(-)
e427d2
e427d2
diff --git a/debugfs/do_journal.c b/debugfs/do_journal.c
e427d2
index 15ef6829..5091a530 100644
e427d2
--- a/debugfs/do_journal.c
e427d2
+++ b/debugfs/do_journal.c
e427d2
@@ -554,15 +554,19 @@ void do_journal_write(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
e427d2
 		switch (opt) {
e427d2
 		case 'b':
e427d2
 			err = read_list(optarg, &blist, &bn);
e427d2
-			if (err)
e427d2
+			if (err) {
e427d2
 				com_err(argv[0], err,
e427d2
 					"while reading block list");
e427d2
+				goto out;
e427d2
+			}
e427d2
 			break;
e427d2
 		case 'r':
e427d2
 			err = read_list(optarg, &rlist, &rn);
e427d2
-			if (err)
e427d2
+			if (err) {
e427d2
 				com_err(argv[0], err,
e427d2
 					"while reading revoke list");
e427d2
+				goto out;
e427d2
+			}
e427d2
 			break;
e427d2
 		case 'c':
e427d2
 			flags |= JOURNAL_WRITE_NO_COMMIT;
e427d2
diff --git a/debugfs/util.c b/debugfs/util.c
e427d2
index 091f6f65..bbb20ff6 100644
e427d2
--- a/debugfs/util.c
e427d2
+++ b/debugfs/util.c
e427d2
@@ -521,7 +521,7 @@ errcode_t read_list(char *str, blk64_t **list, size_t *len)
e427d2
 	blk64_t *lst = *list;
e427d2
 	size_t ln = *len;
e427d2
 	char *tok, *p = str;
e427d2
-	errcode_t retval;
e427d2
+	errcode_t retval = 0;
e427d2
 
e427d2
 	while ((tok = strtok(p, ","))) {
e427d2
 		blk64_t *l;
e427d2
@@ -538,15 +538,17 @@ errcode_t read_list(char *str, blk64_t **list, size_t *len)
e427d2
 				return errno;
e427d2
 		} else if (*e != 0) {
e427d2
 			retval = EINVAL;
e427d2
-			goto err;
e427d2
+			break;
e427d2
 		}
e427d2
 		if (y < x) {
e427d2
 			retval = EINVAL;
e427d2
-			goto err;
e427d2
+			break;
e427d2
 		}
e427d2
 		l = realloc(lst, sizeof(blk64_t) * (ln + y - x + 1));
e427d2
-		if (l == NULL)
e427d2
-			return ENOMEM;
e427d2
+		if (l == NULL) {
e427d2
+			retval = ENOMEM;
e427d2
+			break;
e427d2
+		}
e427d2
 		lst = l;
e427d2
 		for (; x <= y; x++)
e427d2
 			lst[ln++] = x;
e427d2
@@ -555,8 +557,5 @@ errcode_t read_list(char *str, blk64_t **list, size_t *len)
e427d2
 
e427d2
 	*list = lst;
e427d2
 	*len = ln;
e427d2
-	return 0;
e427d2
-err:
e427d2
-	free(lst);
e427d2
 	return retval;
e427d2
 }
e427d2
-- 
e427d2
2.35.1
e427d2