Received: by 2002:a05:6358:700f:b0:131:369:b2a3 with SMTP id 15csp2828750rwo; Thu, 3 Aug 2023 16:05:38 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGXux0TxOb3WslYffmj71sKsHl4Lx86nFptdPft9+nJe2227poNu+gpbSzWSchQMFJUhnGo X-Received: by 2002:aa7:c659:0:b0:522:2019:2020 with SMTP id z25-20020aa7c659000000b0052220192020mr153752edr.17.1691103938024; Thu, 03 Aug 2023 16:05:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1691103938; cv=none; d=google.com; s=arc-20160816; b=Zk5nvemve6zWqdwbwYKyuT+OldxcF49m/YnCNYfmEN8tCzl+gl8NCZtE8LrVpB2TQv hOU5l+VIynpvXFncQZh4tNjhIGQKjyqeOvE8uIxv6JU5b/Uony+Y/+vTW9Wz5eV4qLXM 5iqreRu+fkZoKQnXqH2XBXz4nQVsZPMVvtWpGxaDZqwkG/Tle6NIEeiQTE+57l7gwB+g 2j2yDV72rYcdbCsWpXFC3ETCJsEVo32FLhBT/FaJsdV1V/JpES+Vk5ffZbT0O1KK2lMN KX31MOATKMjVD3XCFH3Eoe8R7x+itHXKWlc4TTJljLQ/v+GpsMW1wWpP82363Nxx158/ 5XAw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:message-id:mime-version:date :dkim-signature; bh=/3+2LaUZtSIgyae9U3pa7SONeLjf47F4TsaDo1cDfHY=; fh=xl0pInZ9h7FWAJIM9oBrNQMVZ9UqIAn7Iotr7I3k1m0=; b=Se3bf+7jYq/jgpAPaUEvqm47EDUc610iHD4rG+g7wQ04d8/vnPol889lyb9h5lrWGk VX0jgxaawgZFvrYAdJf/zEIF/7OQPnUzpP6AoS3VvKpyxZdG5CJauubeM53K8N33QXG+ KMxk5nZbSj6DD8JrlMNPSu+KbLkGN5gVM/POhqQIMJW6eklCBGDystfH4VR5hWxi5RFJ zEDb5wyS6c9LznHVLR/lpMMbL8yWuU0KS9wFeybkjtyx/uwld2iCRxpE8TPhlWQG10EI +9ILh17wxdgXS4uq2BFPoEWIuATTkyBtsThO3EdoIRppLjb0YB/qBcIbXoop4lr3VREO 9XhA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20221208 header.b=qWf+koP6; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id b11-20020aa7cd0b000000b0052290105ca7si534254edw.653.2023.08.03.16.05.12; Thu, 03 Aug 2023 16:05:38 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20221208 header.b=qWf+koP6; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230180AbjHCThI (ORCPT + 99 others); Thu, 3 Aug 2023 15:37:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34256 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230190AbjHCThG (ORCPT ); Thu, 3 Aug 2023 15:37:06 -0400 Received: from mail-yw1-x1149.google.com (mail-yw1-x1149.google.com [IPv6:2607:f8b0:4864:20::1149]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0C2953C3B for ; Thu, 3 Aug 2023 12:37:05 -0700 (PDT) Received: by mail-yw1-x1149.google.com with SMTP id 00721157ae682-586a5cd0ea9so401997b3.2 for ; Thu, 03 Aug 2023 12:37:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1691091424; x=1691696224; h=cc:to:from:subject:message-id:mime-version:date:from:to:cc:subject :date:message-id:reply-to; bh=/3+2LaUZtSIgyae9U3pa7SONeLjf47F4TsaDo1cDfHY=; b=qWf+koP6WJCj/KpJbCA4hgfI7JomP8DSBT1WVRZ9XD0a2oXEvZlRRXgOJrVujtv1YW MechMeRwb/u4MQn8M/Nyxjk8NjcMg9aqJOtku0z3XdcJ3hUBng2T84IWEYuS8f9msy9D sUQMF1O4ExhUXjey2Re3fPhK3HlMp9uU+wIzDxikzjlLrJG4cArmRA0z+quVWiG4mCN+ ws9lWlifMZH0JpePdPAIqz5jShUJB0ATwSGB/9PzCLbfA5hw2+dfuUq4OL9VVWu29xdz z/Q1Ywz6umTlf4m5wNYWzywUHrOzwG8Z0viK0/MVh3px42GqKr+BZ62XoAjlLKmX/9rc 2TIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691091424; x=1691696224; h=cc:to:from:subject:message-id:mime-version:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=/3+2LaUZtSIgyae9U3pa7SONeLjf47F4TsaDo1cDfHY=; b=CwYNJhYAFjndgWBocSdNWdmVdSnOz/v69JkFe1Af93YKtIf7R0oLN/DAbVTjxK13EA rWrWLSqrTWOF53NCxaZAhJz/1VF5Zo8SQn3BWdezP8Q+nN7th/ILL6k5hmaomYZgmb7I 3OhlPelm/98D8yrUkTP97K9TMrNylF6hzAiUN4aWVNrrLwKsongk+XmFrCo9v28AcFrw BCqmeLqlw7fBG2wf4yuhhNAdCXh2pgW2XuW8gjsg3WssFF74qH4fR3cEvtufnIjr2wGl RyR28J10prNOUPXEfbm0+Zndr1Yig+TQW1VlXLtSYinha6+90Iywn4HsthswlC3a3dW5 9XNA== X-Gm-Message-State: ABy/qLbxtSTExaJHWe/CZ3eJVeWpwjil3OownOHOnI6FIKrs43HHrQpr o8uR/iFWNNmn2Y0PtYFFkTcyCz5p5g== X-Received: from rmoar-specialist.c.googlers.com ([fda3:e722:ac3:cc00:2b:7d90:c0a8:45d3]) (user=rmoar job=sendgmr) by 2002:a25:db82:0:b0:d0d:cce3:d32d with SMTP id g124-20020a25db82000000b00d0dcce3d32dmr151304ybf.6.1691091424358; Thu, 03 Aug 2023 12:37:04 -0700 (PDT) Date: Thu, 3 Aug 2023 19:36:35 +0000 Mime-Version: 1.0 X-Mailer: git-send-email 2.41.0.585.gd2178a4bd4-goog Message-ID: <20230803193635.1047337-1-rmoar@google.com> Subject: [PATCH -next v2] kunit: fix uninitialized variables bug in attributes filtering From: Rae Moar To: shuah@kernel.org, davidgow@google.com, brendan.higgins@linux.dev Cc: ruanjinjie@huawei.com, linux-kselftest@vger.kernel.org, kunit-dev@googlegroups.com, linux-kernel@vger.kernel.org, Rae Moar , kernel test robot , Dan Carpenter Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Fix smatch warnings regarding uninitialized variables in the filtering patch of the new KUnit Attributes feature. Fixes: 529534e8cba3 ("kunit: Add ability to filter attributes") Reported-by: kernel test robot Reported-by: Dan Carpenter Closes: https://lore.kernel.org/r/202307270610.s0w4NKEn-lkp@intel.com/ Signed-off-by: Rae Moar --- Change since v1: - Changed initialization of filtered to be {NULL, NULL} at the start and only updated when ready to return. - Remove unnecessary +1 in memory allocation for parsed_filters in executor test. Note that this is rebased on top of the recent fix: ("kunit: fix possible memory leak in kunit_filter_suites()"). lib/kunit/attributes.c | 40 +++++++++++++++++---------------------- lib/kunit/executor.c | 18 +++++++++++------- lib/kunit/executor_test.c | 2 +- 3 files changed, 29 insertions(+), 31 deletions(-) diff --git a/lib/kunit/attributes.c b/lib/kunit/attributes.c index d37c40c0ce4f..5e3034b6be99 100644 --- a/lib/kunit/attributes.c +++ b/lib/kunit/attributes.c @@ -102,7 +102,7 @@ static int int_filter(long val, const char *op, int input, int *err) static int attr_enum_filter(void *attr, const char *input, int *err, const char * const str_list[], int max) { - int i, j, input_int; + int i, j, input_int = -1; long test_val = (long)attr; const char *input_val = NULL; @@ -124,7 +124,7 @@ static int attr_enum_filter(void *attr, const char *input, int *err, input_int = j; } - if (!input_int) { + if (input_int < 0) { *err = -EINVAL; pr_err("kunit executor: invalid filter input: %s\n", input); return false; @@ -186,8 +186,10 @@ static void *attr_module_get(void *test_or_suite, bool is_test) // Suites get their module attribute from their first test_case if (test) return ((void *) test->module_name); - else + else if (kunit_suite_num_test_cases(suite) > 0) return ((void *) suite->test_cases[0].module_name); + else + return (void *) ""; } /* List of all Test Attributes */ @@ -221,7 +223,7 @@ const char *kunit_attr_filter_name(struct kunit_attr_filter filter) void kunit_print_attr(void *test_or_suite, bool is_test, unsigned int test_level) { int i; - bool to_free; + bool to_free = false; void *attr; const char *attr_name, *attr_str; struct kunit_suite *suite = is_test ? NULL : test_or_suite; @@ -255,7 +257,7 @@ void kunit_print_attr(void *test_or_suite, bool is_test, unsigned int test_level int kunit_get_filter_count(char *input) { - int i, comma_index, count = 0; + int i, comma_index = 0, count = 0; for (i = 0; input[i]; i++) { if (input[i] == ',') { @@ -272,7 +274,7 @@ int kunit_get_filter_count(char *input) struct kunit_attr_filter kunit_next_attr_filter(char **filters, int *err) { struct kunit_attr_filter filter = {}; - int i, j, comma_index, new_start_index; + int i, j, comma_index = 0, new_start_index = 0; int op_index = -1, attr_index = -1; char op; char *input = *filters; @@ -316,7 +318,7 @@ struct kunit_attr_filter kunit_next_attr_filter(char **filters, int *err) filter.attr = &kunit_attr_list[attr_index]; } - if (comma_index) { + if (comma_index > 0) { input[comma_index] = '\0'; filter.input = input + op_index; input = input + new_start_index; @@ -356,31 +358,22 @@ struct kunit_suite *kunit_filter_attr_tests(const struct kunit_suite *const suit /* Save filtering result on default value */ default_result = filter.attr->filter(filter.attr->attr_default, filter.input, err); - if (*err) { - kfree(copy); - kfree(filtered); - return NULL; - } + if (*err) + goto err; /* Save suite attribute value and filtering result on that value */ suite_val = filter.attr->get_attr((void *)suite, false); suite_result = filter.attr->filter(suite_val, filter.input, err); - if (*err) { - kfree(copy); - kfree(filtered); - return NULL; - } + if (*err) + goto err; /* For each test case, save test case if passes filtering. */ kunit_suite_for_each_test_case(suite, test_case) { test_val = filter.attr->get_attr((void *) test_case, true); test_result = filter.attr->filter(filter.attr->get_attr(test_case, true), filter.input, err); - if (*err) { - kfree(copy); - kfree(filtered); - return NULL; - } + if (*err) + goto err; /* * If attribute value of test case is set, filter on that value. @@ -406,7 +399,8 @@ struct kunit_suite *kunit_filter_attr_tests(const struct kunit_suite *const suit } } - if (n == 0) { +err: + if (n == 0 || *err) { kfree(copy); kfree(filtered); return NULL; diff --git a/lib/kunit/executor.c b/lib/kunit/executor.c index 481901d245d0..dc295150c4e5 100644 --- a/lib/kunit/executor.c +++ b/lib/kunit/executor.c @@ -127,19 +127,18 @@ static struct suite_set kunit_filter_suites(const struct suite_set *suite_set, { int i, j, k; int filter_count = 0; - struct kunit_suite **copy, *filtered_suite, *new_filtered_suite; - struct suite_set filtered; + struct kunit_suite **copy, **copy_start, *filtered_suite, *new_filtered_suite; + struct suite_set filtered = {NULL, NULL}; struct kunit_glob_filter parsed_glob; - struct kunit_attr_filter *parsed_filters; + struct kunit_attr_filter *parsed_filters = NULL; const size_t max = suite_set->end - suite_set->start; copy = kmalloc_array(max, sizeof(*filtered.start), GFP_KERNEL); - filtered.start = copy; if (!copy) { /* won't be able to run anything, return an empty set */ - filtered.end = copy; return filtered; } + copy_start = copy; if (filter_glob) kunit_parse_glob_filter(&parsed_glob, filter_glob); @@ -147,7 +146,11 @@ static struct suite_set kunit_filter_suites(const struct suite_set *suite_set, /* Parse attribute filters */ if (filters) { filter_count = kunit_get_filter_count(filters); - parsed_filters = kcalloc(filter_count + 1, sizeof(*parsed_filters), GFP_KERNEL); + parsed_filters = kcalloc(filter_count, sizeof(*parsed_filters), GFP_KERNEL); + if (!parsed_filters) { + kfree(copy); + return filtered; + } for (j = 0; j < filter_count; j++) parsed_filters[j] = kunit_next_attr_filter(&filters, err); if (*err) @@ -166,7 +169,7 @@ static struct suite_set kunit_filter_suites(const struct suite_set *suite_set, goto err; } } - if (filter_count) { + if (filter_count > 0 && parsed_filters != NULL) { for (k = 0; k < filter_count; k++) { new_filtered_suite = kunit_filter_attr_tests(filtered_suite, parsed_filters[k], filter_action, err); @@ -195,6 +198,7 @@ static struct suite_set kunit_filter_suites(const struct suite_set *suite_set, *copy++ = filtered_suite; } + filtered.start = copy_start; filtered.end = copy; err: diff --git a/lib/kunit/executor_test.c b/lib/kunit/executor_test.c index 01280cb8d451..3e0a1c99cb4e 100644 --- a/lib/kunit/executor_test.c +++ b/lib/kunit/executor_test.c @@ -119,7 +119,7 @@ static void parse_filter_attr_test(struct kunit *test) filter_count = kunit_get_filter_count(filters); KUNIT_EXPECT_EQ(test, filter_count, 2); - parsed_filters = kunit_kcalloc(test, filter_count + 1, sizeof(*parsed_filters), + parsed_filters = kunit_kcalloc(test, filter_count, sizeof(*parsed_filters), GFP_KERNEL); for (j = 0; j < filter_count; j++) { parsed_filters[j] = kunit_next_attr_filter(&filters, &err); base-commit: 3bffe185ad11e408903d2782727877388d08d94e -- 2.41.0.585.gd2178a4bd4-goog