On 16/11/20 1:14 am, Marco Elver wrote: > On Sun, 15 Nov 2020 at 19:59, Arpitha Raghunandan <98.arpi@xxxxxxxxx> wrote: >> >> Modify fs/ext4/inode-test.c to use the parameterized testing >> feature of KUnit. >> >> Signed-off-by: Arpitha Raghunandan <98.arpi@xxxxxxxxx> >> Signed-off-by: Marco Elver <elver@xxxxxxxxxx> >> --- >> Changes v7->v8: >> - Replace strcpy() with strncpy() in timestamp_expectation_to_desc() >> Changes v6->v7: >> - Introduce timestamp_expectation_to_desc() to convert param to >> description. >> Changes v5->v6: >> - No change to this patch of the patch series >> Changes v4->v5: >> - No change to this patch of the patch series >> Changes v3->v4: >> - Modification based on latest implementation of KUnit parameterized testing >> Changes v2->v3: >> - Marked hardcoded test data const >> - Modification based on latest implementation of KUnit parameterized testing >> Changes v1->v2: >> - Modification based on latest implementation of KUnit parameterized testing >> >> fs/ext4/inode-test.c | 323 ++++++++++++++++++++++--------------------- >> 1 file changed, 167 insertions(+), 156 deletions(-) >> >> diff --git a/fs/ext4/inode-test.c b/fs/ext4/inode-test.c >> index d62d802c9c12..2c0c00c45c6b 100644 >> --- a/fs/ext4/inode-test.c >> +++ b/fs/ext4/inode-test.c >> @@ -80,6 +80,148 @@ struct timestamp_expectation { >> bool lower_bound; >> }; >> >> +static const struct timestamp_expectation test_data[] = { >> + { >> + .test_case_name = LOWER_BOUND_NEG_NO_EXTRA_BITS_CASE, >> + .msb_set = true, >> + .lower_bound = true, >> + .extra_bits = 0, >> + .expected = {.tv_sec = -0x80000000LL, .tv_nsec = 0L}, >> + }, >> + >> + { >> + .test_case_name = UPPER_BOUND_NEG_NO_EXTRA_BITS_CASE, >> + .msb_set = true, >> + .lower_bound = false, >> + .extra_bits = 0, >> + .expected = {.tv_sec = -1LL, .tv_nsec = 0L}, >> + }, >> + >> + { >> + .test_case_name = LOWER_BOUND_NONNEG_NO_EXTRA_BITS_CASE, >> + .msb_set = false, >> + .lower_bound = true, >> + .extra_bits = 0, >> + .expected = {0LL, 0L}, >> + }, >> + >> + { >> + .test_case_name = UPPER_BOUND_NONNEG_NO_EXTRA_BITS_CASE, >> + .msb_set = false, >> + .lower_bound = false, >> + .extra_bits = 0, >> + .expected = {.tv_sec = 0x7fffffffLL, .tv_nsec = 0L}, >> + }, >> + >> + { >> + .test_case_name = LOWER_BOUND_NEG_LO_1_CASE, >> + .msb_set = true, >> + .lower_bound = true, >> + .extra_bits = 1, >> + .expected = {.tv_sec = 0x80000000LL, .tv_nsec = 0L}, >> + }, >> + >> + { >> + .test_case_name = UPPER_BOUND_NEG_LO_1_CASE, >> + .msb_set = true, >> + .lower_bound = false, >> + .extra_bits = 1, >> + .expected = {.tv_sec = 0xffffffffLL, .tv_nsec = 0L}, >> + }, >> + >> + { >> + .test_case_name = LOWER_BOUND_NONNEG_LO_1_CASE, >> + .msb_set = false, >> + .lower_bound = true, >> + .extra_bits = 1, >> + .expected = {.tv_sec = 0x100000000LL, .tv_nsec = 0L}, >> + }, >> + >> + { >> + .test_case_name = UPPER_BOUND_NONNEG_LO_1_CASE, >> + .msb_set = false, >> + .lower_bound = false, >> + .extra_bits = 1, >> + .expected = {.tv_sec = 0x17fffffffLL, .tv_nsec = 0L}, >> + }, >> + >> + { >> + .test_case_name = LOWER_BOUND_NEG_HI_1_CASE, >> + .msb_set = true, >> + .lower_bound = true, >> + .extra_bits = 2, >> + .expected = {.tv_sec = 0x180000000LL, .tv_nsec = 0L}, >> + }, >> + >> + { >> + .test_case_name = UPPER_BOUND_NEG_HI_1_CASE, >> + .msb_set = true, >> + .lower_bound = false, >> + .extra_bits = 2, >> + .expected = {.tv_sec = 0x1ffffffffLL, .tv_nsec = 0L}, >> + }, >> + >> + { >> + .test_case_name = LOWER_BOUND_NONNEG_HI_1_CASE, >> + .msb_set = false, >> + .lower_bound = true, >> + .extra_bits = 2, >> + .expected = {.tv_sec = 0x200000000LL, .tv_nsec = 0L}, >> + }, >> + >> + { >> + .test_case_name = UPPER_BOUND_NONNEG_HI_1_CASE, >> + .msb_set = false, >> + .lower_bound = false, >> + .extra_bits = 2, >> + .expected = {.tv_sec = 0x27fffffffLL, .tv_nsec = 0L}, >> + }, >> + >> + { >> + .test_case_name = UPPER_BOUND_NONNEG_HI_1_NS_1_CASE, >> + .msb_set = false, >> + .lower_bound = false, >> + .extra_bits = 6, >> + .expected = {.tv_sec = 0x27fffffffLL, .tv_nsec = 1L}, >> + }, >> + >> + { >> + .test_case_name = LOWER_BOUND_NONNEG_HI_1_NS_MAX_CASE, >> + .msb_set = false, >> + .lower_bound = true, >> + .extra_bits = 0xFFFFFFFF, >> + .expected = {.tv_sec = 0x300000000LL, >> + .tv_nsec = MAX_NANOSECONDS}, >> + }, >> + >> + { >> + .test_case_name = LOWER_BOUND_NONNEG_EXTRA_BITS_1_CASE, >> + .msb_set = false, >> + .lower_bound = true, >> + .extra_bits = 3, >> + .expected = {.tv_sec = 0x300000000LL, .tv_nsec = 0L}, >> + }, >> + >> + { >> + .test_case_name = UPPER_BOUND_NONNEG_EXTRA_BITS_1_CASE, >> + .msb_set = false, >> + .lower_bound = false, >> + .extra_bits = 3, >> + .expected = {.tv_sec = 0x37fffffffLL, .tv_nsec = 0L}, >> + } >> +}; >> + >> +static void timestamp_expectation_to_desc(const struct timestamp_expectation *t, >> + char *desc) >> +{ >> + int desc_length = strlen(t->test_case_name); >> + >> + strncpy(desc, t->test_case_name, desc_length); >> + desc[desc_length] = '\0'; >> +} > > This unfortunately won't prevent out-of-bounds accesses if the > description is longer than KUNIT_PARAM_DESC_SIZE. > > With strncpy() we want to avoid copying more bytes than the > destination buffer can hold. This can be done by simply a > strncpy(desc, t->test_case_name, KUNIT_PARAM_DESC_SIZE). But, > strncpy() is unsafe in certain cases, too, so the kernel introduced > strscpy() -- see the note about strncpy() in > Documentation/process/deprecated.rst. Also have a look at the > documentation about str{n,l,s}cpy() in lib/string.c. > > So, finally, what we want here is just 1 line: > > strscpy(desc, t->test_case_name, KUNIT_PARAM_DESC_SIZE); > Okay, I'll look this up and make this change for v9. > Patch 1/2 looks fine though, so hopefully v9 will be final. :-) > > Thanks, > -- Marco > Thanks!