From nobody Tue Apr 7 05:10:03 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9C5F7C433F5 for ; Mon, 10 Oct 2022 22:06:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229785AbiJJWGN (ORCPT ); Mon, 10 Oct 2022 18:06:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53780 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229657AbiJJWFx (ORCPT ); Mon, 10 Oct 2022 18:05:53 -0400 Received: from mail-pj1-x104a.google.com (mail-pj1-x104a.google.com [IPv6:2607:f8b0:4864:20::104a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 202F7543C4 for ; Mon, 10 Oct 2022 15:05:50 -0700 (PDT) Received: by mail-pj1-x104a.google.com with SMTP id nn14-20020a17090b38ce00b0020acfa1403bso18942pjb.1 for ; Mon, 10 Oct 2022 15:05:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=Pu3l3OfjWm+NknT1HWc/AwH+C/OxT+Gby0UIFZe6Dq4=; b=M1tOpwpH8Y5gzSJTswaDu0uUgRXKCKD/6z5frSxGcp6xAE7fmL/xg4mgyJNVPhPPHJ OJiHsI5EWsgpKjeazzRKCt8RMvfNXPcuJewPBNwl0BkKYj7jF5vzVLxqLQvwH7vL5/1o dtSdfHnLmgftgmaAVnwUkmturLx5MEAZwF+mtKXDpPXerQ6vt+flZg95ogaKN0KFUx07 0NM0qqW76VNHHGtAgJZfqqRCA+Uyzxkw2hCCFJkP3pZWQyY9dQUAIXyHLSDa313qYz99 96W8sE6guP3A75K6GTOWWWqoDw743ix6YK+UhXxLpEUDBU9NpCFP0DZje3hjiEeau9Jq /L5g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Pu3l3OfjWm+NknT1HWc/AwH+C/OxT+Gby0UIFZe6Dq4=; b=uLwaShVpCihdzjeIQBcakbWUcmmXgc/EzeeGFiMtrB/HrOfGKPg1NvvdQGkiJJnVLF X4FydrV/jprq210GXIvO+RoAOdCAPPw7GjTBC61TmkR8NE/Yq0kP2cHV/EC6QN+e5MZ1 zXRu85odUdz0SxJ7DD/ahUWfPC4Qd89GKyNCY3ZfL+LpByZord4KdMP0gwVqFvGthhk/ 5CbDDMfKbEogJfxTK4AgnS5qdIMQVQPyOfFCWz7WUcfT0Ytq5TKdbpC/4ZCQlVg+77l2 T5HjVilPtttavqAIzkJoq9MqzpCfqaA+77ukeg7CD1na4nvRhwfK0gOGyKVFDkN0qYp+ EF1g== X-Gm-Message-State: ACrzQf3WXaJtcUPtXtx9wMnxW6cYKhXIpD6uCvU6eKzvdM1U0QIHt2h4 dkGQmkh5omdf3aJkIr0rKmwXIpxM7xkn X-Google-Smtp-Source: AMsMyM4TEKfZUo24wOwpN3CaVf3HnsmbqW3hSuiewUKgoETK92bviutOwexvi6VxOR9qUqUvLX6TaNgw63kI X-Received: from vipin.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:479f]) (user=vipinsh job=sendgmr) by 2002:a05:6a00:1ace:b0:546:94a3:b235 with SMTP id f14-20020a056a001ace00b0054694a3b235mr22123823pfv.50.1665439549888; Mon, 10 Oct 2022 15:05:49 -0700 (PDT) Date: Mon, 10 Oct 2022 15:05:37 -0700 In-Reply-To: <20221010220538.1154054-1-vipinsh@google.com> Mime-Version: 1.0 References: <20221010220538.1154054-1-vipinsh@google.com> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog Message-ID: <20221010220538.1154054-5-vipinsh@google.com> Subject: [PATCH v5 4/5] KVM: selftests: Add atoi_positive() and atoi_non_negative() for input validation From: Vipin Sharma To: seanjc@google.com, pbonzini@redhat.com, dmatlack@google.com Cc: andrew.jones@linux.dev, kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Vipin Sharma Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Many KVM selftests take command line arguments which are supposed to be positive (>0) or non-negative (>=3D0). Some tests do these validation and some missed adding the check. Add atoi_positive() and atoi_non_negative() to validate inputs in selftests before proceeding to use those values. Signed-off-by: Vipin Sharma --- .../selftests/kvm/aarch64/arch_timer.c | 25 ++++--------------- .../testing/selftests/kvm/aarch64/vgic_irq.c | 2 +- .../selftests/kvm/access_tracking_perf_test.c | 2 +- .../selftests/kvm/demand_paging_test.c | 4 +-- .../selftests/kvm/dirty_log_perf_test.c | 12 ++++----- .../testing/selftests/kvm/include/test_util.h | 2 ++ .../selftests/kvm/kvm_page_table_test.c | 4 +-- tools/testing/selftests/kvm/lib/test_util.c | 16 ++++++++++++ .../selftests/kvm/max_guest_memory_test.c | 7 +++--- .../kvm/memslot_modification_stress_test.c | 6 ++--- .../testing/selftests/kvm/memslot_perf_test.c | 22 ++++------------ .../selftests/kvm/set_memory_region_test.c | 2 +- 12 files changed, 46 insertions(+), 58 deletions(-) diff --git a/tools/testing/selftests/kvm/aarch64/arch_timer.c b/tools/testi= ng/selftests/kvm/aarch64/arch_timer.c index 251e7ff04883..24dffcaf7a9f 100644 --- a/tools/testing/selftests/kvm/aarch64/arch_timer.c +++ b/tools/testing/selftests/kvm/aarch64/arch_timer.c @@ -414,36 +414,21 @@ static bool parse_args(int argc, char *argv[]) while ((opt =3D getopt(argc, argv, "hn:i:p:m:")) !=3D -1) { switch (opt) { case 'n': - test_args.nr_vcpus =3D atoi_paranoid(optarg); - if (test_args.nr_vcpus <=3D 0) { - pr_info("Positive value needed for -n\n"); - goto err; - } else if (test_args.nr_vcpus > KVM_MAX_VCPUS) { + test_args.nr_vcpus =3D atoi_positive(optarg); + if (test_args.nr_vcpus > KVM_MAX_VCPUS) { pr_info("Max allowed vCPUs: %u\n", KVM_MAX_VCPUS); goto err; } break; case 'i': - test_args.nr_iter =3D atoi_paranoid(optarg); - if (test_args.nr_iter <=3D 0) { - pr_info("Positive value needed for -i\n"); - goto err; - } + test_args.nr_iter =3D atoi_positive(optarg); break; case 'p': - test_args.timer_period_ms =3D atoi_paranoid(optarg); - if (test_args.timer_period_ms <=3D 0) { - pr_info("Positive value needed for -p\n"); - goto err; - } + test_args.timer_period_ms =3D atoi_positive(optarg); break; case 'm': - test_args.migration_freq_ms =3D atoi_paranoid(optarg); - if (test_args.migration_freq_ms < 0) { - pr_info("0 or positive value needed for -m\n"); - goto err; - } + test_args.migration_freq_ms =3D atoi_non_negative(optarg); break; case 'h': default: diff --git a/tools/testing/selftests/kvm/aarch64/vgic_irq.c b/tools/testing= /selftests/kvm/aarch64/vgic_irq.c index ae90b718070a..d7da5f24db35 100644 --- a/tools/testing/selftests/kvm/aarch64/vgic_irq.c +++ b/tools/testing/selftests/kvm/aarch64/vgic_irq.c @@ -824,7 +824,7 @@ int main(int argc, char **argv) while ((opt =3D getopt(argc, argv, "hn:e:l:")) !=3D -1) { switch (opt) { case 'n': - nr_irqs =3D atoi_paranoid(optarg); + nr_irqs =3D atoi_non_negative(optarg); if (nr_irqs > 1024 || nr_irqs % 32) help(argv[0]); break; diff --git a/tools/testing/selftests/kvm/access_tracking_perf_test.c b/tool= s/testing/selftests/kvm/access_tracking_perf_test.c index c6bcc5301e2c..b30500cc197e 100644 --- a/tools/testing/selftests/kvm/access_tracking_perf_test.c +++ b/tools/testing/selftests/kvm/access_tracking_perf_test.c @@ -368,7 +368,7 @@ int main(int argc, char *argv[]) params.vcpu_memory_bytes =3D parse_size(optarg); break; case 'v': - params.nr_vcpus =3D atoi_paranoid(optarg); + params.nr_vcpus =3D atoi_positive(optarg); break; case 'o': overlap_memory_access =3D true; diff --git a/tools/testing/selftests/kvm/demand_paging_test.c b/tools/testi= ng/selftests/kvm/demand_paging_test.c index 82597fb04146..dcdb6964b1dc 100644 --- a/tools/testing/selftests/kvm/demand_paging_test.c +++ b/tools/testing/selftests/kvm/demand_paging_test.c @@ -427,8 +427,8 @@ int main(int argc, char *argv[]) p.src_type =3D parse_backing_src_type(optarg); break; case 'v': - nr_vcpus =3D atoi_paranoid(optarg); - TEST_ASSERT(nr_vcpus > 0 && nr_vcpus <=3D max_vcpus, + nr_vcpus =3D atoi_positive(optarg); + TEST_ASSERT(nr_vcpus <=3D max_vcpus, "Invalid number of vcpus, must be between 1 and %d", max_vcpus); break; case 'o': diff --git a/tools/testing/selftests/kvm/dirty_log_perf_test.c b/tools/test= ing/selftests/kvm/dirty_log_perf_test.c index ecda802b78ff..618598ddd993 100644 --- a/tools/testing/selftests/kvm/dirty_log_perf_test.c +++ b/tools/testing/selftests/kvm/dirty_log_perf_test.c @@ -416,9 +416,7 @@ int main(int argc, char *argv[]) run_vcpus_while_disabling_dirty_logging =3D true; break; case 'f': - p.wr_fract =3D atoi_paranoid(optarg); - TEST_ASSERT(p.wr_fract >=3D 1, - "Write fraction cannot be less than one"); + p.wr_fract =3D atoi_positive(optarg); break; case 'g': dirty_log_manual_caps =3D 0; @@ -427,7 +425,7 @@ int main(int argc, char *argv[]) help(argv[0]); break; case 'i': - p.iterations =3D atoi_paranoid(optarg); + p.iterations =3D atoi_positive(optarg); break; case 'm': guest_modes_cmdline(optarg); @@ -445,12 +443,12 @@ int main(int argc, char *argv[]) p.backing_src =3D parse_backing_src_type(optarg); break; case 'v': - nr_vcpus =3D atoi_paranoid(optarg); - TEST_ASSERT(nr_vcpus > 0 && nr_vcpus <=3D max_vcpus, + nr_vcpus =3D atoi_positive(optarg); + TEST_ASSERT(nr_vcpus <=3D max_vcpus, "Invalid number of vcpus, must be between 1 and %d", max_vcpus); break; case 'x': - p.slots =3D atoi_paranoid(optarg); + p.slots =3D atoi_positive(optarg); break; default: help(argv[0]); diff --git a/tools/testing/selftests/kvm/include/test_util.h b/tools/testin= g/selftests/kvm/include/test_util.h index feae42863759..9c7b2c186a48 100644 --- a/tools/testing/selftests/kvm/include/test_util.h +++ b/tools/testing/selftests/kvm/include/test_util.h @@ -153,5 +153,7 @@ static inline void *align_ptr_up(void *x, size_t size) } =20 int atoi_paranoid(const char *num_str); +uint32_t atoi_positive(const char *num_str); +uint32_t atoi_non_negative(const char *num_str); =20 #endif /* SELFTEST_KVM_TEST_UTIL_H */ diff --git a/tools/testing/selftests/kvm/kvm_page_table_test.c b/tools/test= ing/selftests/kvm/kvm_page_table_test.c index ea7feb69bb88..2f62e19976fd 100644 --- a/tools/testing/selftests/kvm/kvm_page_table_test.c +++ b/tools/testing/selftests/kvm/kvm_page_table_test.c @@ -461,8 +461,8 @@ int main(int argc, char *argv[]) p.test_mem_size =3D parse_size(optarg); break; case 'v': - nr_vcpus =3D atoi_paranoid(optarg); - TEST_ASSERT(nr_vcpus > 0 && nr_vcpus <=3D max_vcpus, + nr_vcpus =3D atoi_positive(optarg); + TEST_ASSERT(nr_vcpus <=3D max_vcpus, "Invalid number of vcpus, must be between 1 and %d", max_vcpus); break; case 's': diff --git a/tools/testing/selftests/kvm/lib/test_util.c b/tools/testing/se= lftests/kvm/lib/test_util.c index ec0f070a6f21..210e98a49a83 100644 --- a/tools/testing/selftests/kvm/lib/test_util.c +++ b/tools/testing/selftests/kvm/lib/test_util.c @@ -353,3 +353,19 @@ int atoi_paranoid(const char *num_str) =20 return num; } + +uint32_t atoi_positive(const char *num_str) +{ + int num =3D atoi_paranoid(num_str); + + TEST_ASSERT(num > 0, "%s is not a positive integer.\n", num_str); + return num; +} + +uint32_t atoi_non_negative(const char *num_str) +{ + int num =3D atoi_paranoid(num_str); + + TEST_ASSERT(num >=3D 0, "%s is not a non-negative integer.\n", num_str); + return num; +} diff --git a/tools/testing/selftests/kvm/max_guest_memory_test.c b/tools/te= sting/selftests/kvm/max_guest_memory_test.c index 1595b73dc09a..20015de3b91c 100644 --- a/tools/testing/selftests/kvm/max_guest_memory_test.c +++ b/tools/testing/selftests/kvm/max_guest_memory_test.c @@ -193,15 +193,14 @@ int main(int argc, char *argv[]) while ((opt =3D getopt(argc, argv, "c:h:m:s:H")) !=3D -1) { switch (opt) { case 'c': - nr_vcpus =3D atoi_paranoid(optarg); - TEST_ASSERT(nr_vcpus > 0, "number of vcpus must be >0"); + nr_vcpus =3D atoi_positive(optarg); break; case 'm': - max_mem =3D atoi_paranoid(optarg) * size_1gb; + max_mem =3D atoi_positive(optarg) * size_1gb; TEST_ASSERT(max_mem > 0, "memory size must be >0"); break; case 's': - slot_size =3D atoi_paranoid(optarg) * size_1gb; + slot_size =3D atoi_positive(optarg) * size_1gb; TEST_ASSERT(slot_size > 0, "slot size must be >0"); break; case 'H': diff --git a/tools/testing/selftests/kvm/memslot_modification_stress_test.c= b/tools/testing/selftests/kvm/memslot_modification_stress_test.c index 865276993ffb..7539ee7b6e95 100644 --- a/tools/testing/selftests/kvm/memslot_modification_stress_test.c +++ b/tools/testing/selftests/kvm/memslot_modification_stress_test.c @@ -166,8 +166,8 @@ int main(int argc, char *argv[]) guest_percpu_mem_size =3D parse_size(optarg); break; case 'v': - nr_vcpus =3D atoi_paranoid(optarg); - TEST_ASSERT(nr_vcpus > 0 && nr_vcpus <=3D max_vcpus, + nr_vcpus =3D atoi_positive(optarg); + TEST_ASSERT(nr_vcpus <=3D max_vcpus, "Invalid number of vcpus, must be between 1 and %d", max_vcpus); break; @@ -175,7 +175,7 @@ int main(int argc, char *argv[]) p.partition_vcpu_memory_access =3D false; break; case 'i': - p.nr_memslot_modifications =3D atoi_paranoid(optarg); + p.nr_memslot_modifications =3D atoi_positive(optarg); break; case 'h': default: diff --git a/tools/testing/selftests/kvm/memslot_perf_test.c b/tools/testin= g/selftests/kvm/memslot_perf_test.c index 4bae9e3f5ca1..8e6e2d44d002 100644 --- a/tools/testing/selftests/kvm/memslot_perf_test.c +++ b/tools/testing/selftests/kvm/memslot_perf_test.c @@ -892,33 +892,21 @@ static bool parse_args(int argc, char *argv[], } break; case 'f': - targs->tfirst =3D atoi_paranoid(optarg); - if (targs->tfirst < 0) { - pr_info("First test to run has to be non-negative\n"); - return false; - } + targs->tfirst =3D atoi_non_negative(optarg); break; case 'e': - targs->tlast =3D atoi_paranoid(optarg); - if (targs->tlast < 0 || targs->tlast >=3D NTESTS) { + targs->tlast =3D atoi_non_negative(optarg); + if (targs->tlast >=3D NTESTS) { pr_info("Last test to run has to be non-negative and less than %zu\n", NTESTS); return false; } break; case 'l': - targs->seconds =3D atoi_paranoid(optarg); - if (targs->seconds < 0) { - pr_info("Test length in seconds has to be non-negative\n"); - return false; - } + targs->seconds =3D atoi_non_negative(optarg); break; case 'r': - targs->runs =3D atoi_paranoid(optarg); - if (targs->runs <=3D 0) { - pr_info("Runs per test has to be positive\n"); - return false; - } + targs->runs =3D atoi_positive(optarg); break; } } diff --git a/tools/testing/selftests/kvm/set_memory_region_test.c b/tools/t= esting/selftests/kvm/set_memory_region_test.c index c366949c8362..e09092110121 100644 --- a/tools/testing/selftests/kvm/set_memory_region_test.c +++ b/tools/testing/selftests/kvm/set_memory_region_test.c @@ -407,7 +407,7 @@ int main(int argc, char *argv[]) =20 #ifdef __x86_64__ if (argc > 1) - loops =3D atoi_paranoid(argv[1]); + loops =3D atoi_positive(argv[1]); else loops =3D 10; =20 --=20 2.38.0.rc1.362.ged0d419d3c-goog