Skip to content

Commit 24de14c

Browse files
Jinjie Ruanshuahkh
authored andcommitted
kunit: Fix possible memory leak in kunit_filter_suites()
If the outer layer for loop is iterated more than once and it fails not in the first iteration, the filtered_suite and filtered_suite->test_cases allocated in the last kunit_filter_attr_tests() in last inner for loop is leaked. So add a new free_filtered_suite err label and free the filtered_suite and filtered_suite->test_cases so far. And change kmalloc_array of copy to kcalloc to Clear the copy to make the kfree safe. Fixes: 529534e ("kunit: Add ability to filter attributes") Signed-off-by: Jinjie Ruan <ruanjinjie@huawei.com> Reviewed-by: Rae Moar <rmoar@google.com> Reviewed-by: David Gow <davidgow@google.com> Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
1 parent e446795 commit 24de14c

File tree

1 file changed

+13
-4
lines changed

1 file changed

+13
-4
lines changed

lib/kunit/executor.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,10 +157,11 @@ kunit_filter_suites(const struct kunit_suite_set *suite_set,
157157
struct kunit_suite_set filtered = {NULL, NULL};
158158
struct kunit_glob_filter parsed_glob;
159159
struct kunit_attr_filter *parsed_filters = NULL;
160+
struct kunit_suite * const *suites;
160161

161162
const size_t max = suite_set->end - suite_set->start;
162163

163-
copy = kmalloc_array(max, sizeof(*filtered.start), GFP_KERNEL);
164+
copy = kcalloc(max, sizeof(*filtered.start), GFP_KERNEL);
164165
if (!copy) { /* won't be able to run anything, return an empty set */
165166
return filtered;
166167
}
@@ -195,7 +196,7 @@ kunit_filter_suites(const struct kunit_suite_set *suite_set,
195196
parsed_glob.test_glob);
196197
if (IS_ERR(filtered_suite)) {
197198
*err = PTR_ERR(filtered_suite);
198-
goto free_parsed_filters;
199+
goto free_filtered_suite;
199200
}
200201
}
201202
if (filter_count > 0 && parsed_filters != NULL) {
@@ -212,11 +213,11 @@ kunit_filter_suites(const struct kunit_suite_set *suite_set,
212213
filtered_suite = new_filtered_suite;
213214

214215
if (*err)
215-
goto free_parsed_filters;
216+
goto free_filtered_suite;
216217

217218
if (IS_ERR(filtered_suite)) {
218219
*err = PTR_ERR(filtered_suite);
219-
goto free_parsed_filters;
220+
goto free_filtered_suite;
220221
}
221222
if (!filtered_suite)
222223
break;
@@ -231,6 +232,14 @@ kunit_filter_suites(const struct kunit_suite_set *suite_set,
231232
filtered.start = copy_start;
232233
filtered.end = copy;
233234

235+
free_filtered_suite:
236+
if (*err) {
237+
for (suites = copy_start; suites < copy; suites++) {
238+
kfree((*suites)->test_cases);
239+
kfree(*suites);
240+
}
241+
}
242+
234243
free_parsed_filters:
235244
if (filter_count)
236245
kfree(parsed_filters);

0 commit comments

Comments
 (0)