]> Git Repo - linux.git/commitdiff
KVM: selftests: Add atoi_positive() and atoi_non_negative() for input validation
authorVipin Sharma <[email protected]>
Thu, 3 Nov 2022 19:17:18 +0000 (12:17 -0700)
committerSean Christopherson <[email protected]>
Wed, 16 Nov 2022 18:03:24 +0000 (10:03 -0800)
Many KVM selftests take command line arguments which are supposed to be
positive (>0) or non-negative (>=0). 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 <[email protected]>
Reviewed-by: Sean Christopherson <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Sean Christopherson <[email protected]>
13 files changed:
tools/testing/selftests/kvm/aarch64/arch_timer.c
tools/testing/selftests/kvm/aarch64/debug-exceptions.c
tools/testing/selftests/kvm/aarch64/vgic_irq.c
tools/testing/selftests/kvm/access_tracking_perf_test.c
tools/testing/selftests/kvm/demand_paging_test.c
tools/testing/selftests/kvm/dirty_log_perf_test.c
tools/testing/selftests/kvm/include/test_util.h
tools/testing/selftests/kvm/kvm_page_table_test.c
tools/testing/selftests/kvm/max_guest_memory_test.c
tools/testing/selftests/kvm/memslot_modification_stress_test.c
tools/testing/selftests/kvm/memslot_perf_test.c
tools/testing/selftests/kvm/set_memory_region_test.c
tools/testing/selftests/kvm/x86_64/nx_huge_pages_test.c

index 251e7ff0488317f55239eb1c263570697d1f8c0a..9409617fce9c44034aed224a8675a29eecba1b11 100644 (file)
@@ -414,36 +414,21 @@ static bool parse_args(int argc, char *argv[])
        while ((opt = getopt(argc, argv, "hn:i:p:m:")) != -1) {
                switch (opt) {
                case 'n':
-                       test_args.nr_vcpus = atoi_paranoid(optarg);
-                       if (test_args.nr_vcpus <= 0) {
-                               pr_info("Positive value needed for -n\n");
-                               goto err;
-                       } else if (test_args.nr_vcpus > KVM_MAX_VCPUS) {
+                       test_args.nr_vcpus = atoi_positive("Number of vCPUs", 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 = atoi_paranoid(optarg);
-                       if (test_args.nr_iter <= 0) {
-                               pr_info("Positive value needed for -i\n");
-                               goto err;
-                       }
+                       test_args.nr_iter = atoi_positive("Number of iterations", optarg);
                        break;
                case 'p':
-                       test_args.timer_period_ms = atoi_paranoid(optarg);
-                       if (test_args.timer_period_ms <= 0) {
-                               pr_info("Positive value needed for -p\n");
-                               goto err;
-                       }
+                       test_args.timer_period_ms = atoi_positive("Periodicity", optarg);
                        break;
                case 'm':
-                       test_args.migration_freq_ms = 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 = atoi_non_negative("Frequency", optarg);
                        break;
                case 'h':
                default:
index 19fffdf19c9f9455a00168cfbfaeece33f1130ff..878c334607e1a75d7dafed9febce75d5d9928a84 100644 (file)
@@ -423,7 +423,7 @@ int main(int argc, char *argv[])
        while ((opt = getopt(argc, argv, "i:")) != -1) {
                switch (opt) {
                case 'i':
-                       ss_iteration = atoi_paranoid(optarg);
+                       ss_iteration = atoi_positive("Number of iterations", optarg);
                        break;
                case 'h':
                default:
index ae90b718070aab1cbb03d5814eed74b37eb88630..4ead42a072b7d9e988649364e46726a33f6bbbf6 100644 (file)
@@ -824,7 +824,7 @@ int main(int argc, char **argv)
        while ((opt = getopt(argc, argv, "hn:e:l:")) != -1) {
                switch (opt) {
                case 'n':
-                       nr_irqs = atoi_paranoid(optarg);
+                       nr_irqs = atoi_non_negative("Number of IRQs", optarg);
                        if (nr_irqs > 1024 || nr_irqs % 32)
                                help(argv[0]);
                        break;
index c6bcc5301e2c2becc68115c3c47944b65d6646b0..a81e7a7ae18fec539731f3545e1dab7d4d38b81b 100644 (file)
@@ -368,7 +368,7 @@ int main(int argc, char *argv[])
                        params.vcpu_memory_bytes = parse_size(optarg);
                        break;
                case 'v':
-                       params.nr_vcpus = atoi_paranoid(optarg);
+                       params.nr_vcpus = atoi_positive("Number of vCPUs", optarg);
                        break;
                case 'o':
                        overlap_memory_access = true;
index 82597fb04146f49bcdc88fe65138093d455d66f9..0c98181fa24894c13228278c7dd7641ece0fe1d6 100644 (file)
@@ -427,8 +427,8 @@ int main(int argc, char *argv[])
                        p.src_type = parse_backing_src_type(optarg);
                        break;
                case 'v':
-                       nr_vcpus = atoi_paranoid(optarg);
-                       TEST_ASSERT(nr_vcpus > 0 && nr_vcpus <= max_vcpus,
+                       nr_vcpus = atoi_positive("Number of vCPUs", optarg);
+                       TEST_ASSERT(nr_vcpus <= max_vcpus,
                                    "Invalid number of vcpus, must be between 1 and %d", max_vcpus);
                        break;
                case 'o':
index ecda802b78ffae57f1c2ad2146e4c2bec1061eb1..4d639683b8efa655a30ff09e566d3235fe62bb06 100644 (file)
@@ -416,9 +416,7 @@ int main(int argc, char *argv[])
                        run_vcpus_while_disabling_dirty_logging = true;
                        break;
                case 'f':
-                       p.wr_fract = atoi_paranoid(optarg);
-                       TEST_ASSERT(p.wr_fract >= 1,
-                                   "Write fraction cannot be less than one");
+                       p.wr_fract = atoi_positive("Write fraction", optarg);
                        break;
                case 'g':
                        dirty_log_manual_caps = 0;
@@ -427,7 +425,7 @@ int main(int argc, char *argv[])
                        help(argv[0]);
                        break;
                case 'i':
-                       p.iterations = atoi_paranoid(optarg);
+                       p.iterations = atoi_positive("Number of iterations", optarg);
                        break;
                case 'm':
                        guest_modes_cmdline(optarg);
@@ -445,12 +443,12 @@ int main(int argc, char *argv[])
                        p.backing_src = parse_backing_src_type(optarg);
                        break;
                case 'v':
-                       nr_vcpus = atoi_paranoid(optarg);
-                       TEST_ASSERT(nr_vcpus > 0 && nr_vcpus <= max_vcpus,
+                       nr_vcpus = atoi_positive("Number of vCPUs", optarg);
+                       TEST_ASSERT(nr_vcpus <= max_vcpus,
                                    "Invalid number of vcpus, must be between 1 and %d", max_vcpus);
                        break;
                case 'x':
-                       p.slots = atoi_paranoid(optarg);
+                       p.slots = atoi_positive("Number of slots", optarg);
                        break;
                default:
                        help(argv[0]);
index feae428637599df49bbca2aa3c9db96f8ac00ec1..3be98e81189a7791bc6b1c9847639aac236c6ec0 100644 (file)
@@ -154,4 +154,20 @@ static inline void *align_ptr_up(void *x, size_t size)
 
 int atoi_paranoid(const char *num_str);
 
+static inline uint32_t atoi_positive(const char *name, const char *num_str)
+{
+       int num = atoi_paranoid(num_str);
+
+       TEST_ASSERT(num > 0, "%s must be greater than 0, got '%s'", name, num_str);
+       return num;
+}
+
+static inline uint32_t atoi_non_negative(const char *name, const char *num_str)
+{
+       int num = atoi_paranoid(num_str);
+
+       TEST_ASSERT(num >= 0, "%s must be non-negative, got '%s'", name, num_str);
+       return num;
+}
+
 #endif /* SELFTEST_KVM_TEST_UTIL_H */
index ea7feb69bb88aafd03382a71ba6e92bda1bd9349..696b366be06b4b79809c2e91beed4b635e542b25 100644 (file)
@@ -461,8 +461,8 @@ int main(int argc, char *argv[])
                        p.test_mem_size = parse_size(optarg);
                        break;
                case 'v':
-                       nr_vcpus = atoi_paranoid(optarg);
-                       TEST_ASSERT(nr_vcpus > 0 && nr_vcpus <= max_vcpus,
+                       nr_vcpus = atoi_positive("Number of vCPUs", optarg);
+                       TEST_ASSERT(nr_vcpus <= max_vcpus,
                                    "Invalid number of vcpus, must be between 1 and %d", max_vcpus);
                        break;
                case 's':
index 8056dc5831b52e66e46b00e02794c4f17ed83890..feaf2be20ff255d9db29672967d663e3fad025fc 100644 (file)
@@ -193,16 +193,13 @@ int main(int argc, char *argv[])
        while ((opt = getopt(argc, argv, "c:h:m:s:H")) != -1) {
                switch (opt) {
                case 'c':
-                       nr_vcpus = atoi_paranoid(optarg);
-                       TEST_ASSERT(nr_vcpus > 0, "number of vcpus must be >0");
+                       nr_vcpus = atoi_positive("Number of vCPUs", optarg);
                        break;
                case 'm':
-                       max_mem = 1ull * atoi_paranoid(optarg) * SZ_1G;
-                       TEST_ASSERT(max_mem > 0, "memory size must be >0");
+                       max_mem = 1ull * atoi_positive("Memory size", optarg) * SZ_1G;
                        break;
                case 's':
-                       slot_size = 1ull * atoi_paranoid(optarg) * SZ_1G;
-                       TEST_ASSERT(slot_size > 0, "slot size must be >0");
+                       slot_size = 1ull * atoi_positive("Slot size", optarg) * SZ_1G;
                        break;
                case 'H':
                        hugepages = true;
index 3a67d3637f48196762f37b979df9c8b03672f62f..4bdfc910ba4d3f87d51d76b97990f68da19f4847 100644 (file)
@@ -156,16 +156,14 @@ int main(int argc, char *argv[])
                        guest_modes_cmdline(optarg);
                        break;
                case 'd':
-                       p.delay = atoi_paranoid(optarg);
-                       TEST_ASSERT(p.delay >= 0,
-                                   "A negative delay is not supported.");
+                       p.delay = atoi_non_negative("Delay", optarg);
                        break;
                case 'b':
                        guest_percpu_mem_size = parse_size(optarg);
                        break;
                case 'v':
-                       nr_vcpus = atoi_paranoid(optarg);
-                       TEST_ASSERT(nr_vcpus > 0 && nr_vcpus <= max_vcpus,
+                       nr_vcpus = atoi_positive("Number of vCPUs", optarg);
+                       TEST_ASSERT(nr_vcpus <= max_vcpus,
                                    "Invalid number of vcpus, must be between 1 and %d",
                                    max_vcpus);
                        break;
@@ -173,7 +171,7 @@ int main(int argc, char *argv[])
                        p.partition_vcpu_memory_access = false;
                        break;
                case 'i':
-                       p.nr_iterations = atoi_paranoid(optarg);
+                       p.nr_iterations = atoi_positive("Number of iterations", optarg);
                        break;
                case 'h':
                default:
index 4bae9e3f5ca1e123b9cb7e135ef046f52f8f531c..330aaef1c02fb85292886eaf4f011b6f818fb061 100644 (file)
@@ -892,33 +892,21 @@ static bool parse_args(int argc, char *argv[],
                        }
                        break;
                case 'f':
-                       targs->tfirst = atoi_paranoid(optarg);
-                       if (targs->tfirst < 0) {
-                               pr_info("First test to run has to be non-negative\n");
-                               return false;
-                       }
+                       targs->tfirst = atoi_non_negative("First test", optarg);
                        break;
                case 'e':
-                       targs->tlast = atoi_paranoid(optarg);
-                       if (targs->tlast < 0 || targs->tlast >= NTESTS) {
+                       targs->tlast = atoi_non_negative("Last test", optarg);
+                       if (targs->tlast >= 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 = atoi_paranoid(optarg);
-                       if (targs->seconds < 0) {
-                               pr_info("Test length in seconds has to be non-negative\n");
-                               return false;
-                       }
+                       targs->seconds = atoi_non_negative("Test length", optarg);
                        break;
                case 'r':
-                       targs->runs = atoi_paranoid(optarg);
-                       if (targs->runs <= 0) {
-                               pr_info("Runs per test has to be positive\n");
-                               return false;
-                       }
+                       targs->runs = atoi_positive("Runs per test", optarg);
                        break;
                }
        }
index c366949c8362c8588f2f0481a4968a78e30580ff..85c16f09a50e1ce2c91225be6f9f536636ab5189 100644 (file)
@@ -407,7 +407,7 @@ int main(int argc, char *argv[])
 
 #ifdef __x86_64__
        if (argc > 1)
-               loops = atoi_paranoid(argv[1]);
+               loops = atoi_positive("Number of iterations", argv[1]);
        else
                loops = 10;
 
index 354b6902849c5d64302b91049cd7c257a36122db..ea0978f22db860b0dcfd92a6dee48fb6d6579485 100644 (file)
@@ -241,7 +241,7 @@ int main(int argc, char **argv)
        while ((opt = getopt(argc, argv, "hp:t:r")) != -1) {
                switch (opt) {
                case 'p':
-                       reclaim_period_ms = atoi_paranoid(optarg);
+                       reclaim_period_ms = atoi_non_negative("Reclaim period", optarg);
                        break;
                case 't':
                        token = atoi_paranoid(optarg);
@@ -257,7 +257,6 @@ int main(int argc, char **argv)
        }
 
        TEST_REQUIRE(kvm_has_cap(KVM_CAP_VM_DISABLE_NX_HUGE_PAGES));
-       TEST_REQUIRE(reclaim_period_ms > 0);
 
        __TEST_REQUIRE(token == MAGIC_TOKEN,
                       "This test must be run with the magic token %d.\n"
This page took 0.06476 seconds and 4 git commands to generate.