lkml.org 
[lkml]   [2019]   [Feb]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH v5 09/12] __wr_after_init: rodata_test: refactor tests
    Date
    Refactor the test cases, in preparation for using them also for testing
    __wr_after_init memory, when available.

    Signed-off-by: Igor Stoppa <igor.stoppa@huawei.com>

    CC: Andy Lutomirski <luto@amacapital.net>
    CC: Nadav Amit <nadav.amit@gmail.com>
    CC: Matthew Wilcox <willy@infradead.org>
    CC: Peter Zijlstra <peterz@infradead.org>
    CC: Kees Cook <keescook@chromium.org>
    CC: Dave Hansen <dave.hansen@linux.intel.com>
    CC: Mimi Zohar <zohar@linux.vnet.ibm.com>
    CC: Thiago Jung Bauermann <bauerman@linux.ibm.com>
    CC: Ahmed Soliman <ahmedsoliman@mena.vt.edu>
    CC: linux-integrity@vger.kernel.org
    CC: kernel-hardening@lists.openwall.com
    CC: linux-mm@kvack.org
    CC: linux-kernel@vger.kernel.org
    ---
    mm/rodata_test.c | 48 ++++++++++++++++++++++++++++--------------------
    1 file changed, 28 insertions(+), 20 deletions(-)

    diff --git a/mm/rodata_test.c b/mm/rodata_test.c
    index d908c8769b48..e1349520b436 100644
    --- a/mm/rodata_test.c
    +++ b/mm/rodata_test.c
    @@ -14,44 +14,52 @@
    #include <linux/uaccess.h>
    #include <asm/sections.h>

    -static const int rodata_test_data = 0xC3;
    +#define INIT_TEST_VAL 0xC3

    -void rodata_test(void)
    +static const int rodata_test_data = INIT_TEST_VAL;
    +
    +static bool test_data(char *data_type, const int *data,
    + unsigned long start, unsigned long end)
    {
    - unsigned long start, end;
    int zero = 0;

    /* test 1: read the value */
    /* If this test fails, some previous testrun has clobbered the state */
    - if (!rodata_test_data) {
    - pr_err("test 1 fails (start data)\n");
    - return;
    + if (*data != INIT_TEST_VAL) {
    + pr_err("%s: test 1 fails (init data value)\n", data_type);
    + return false;
    }

    /* test 2: write to the variable; this should fault */
    - if (!probe_kernel_write((void *)&rodata_test_data,
    - (void *)&zero, sizeof(zero))) {
    - pr_err("test data was not read only\n");
    - return;
    + if (!probe_kernel_write((void *)data, (void *)&zero, sizeof(zero))) {
    + pr_err("%s: test data was not read only\n", data_type);
    + return false;
    }

    /* test 3: check the value hasn't changed */
    - if (rodata_test_data == zero) {
    - pr_err("test data was changed\n");
    - return;
    + if (*data != INIT_TEST_VAL) {
    + pr_err("%s: test data was changed\n", data_type);
    + return false;
    }

    /* test 4: check if the rodata section is PAGE_SIZE aligned */
    - start = (unsigned long)__start_rodata;
    - end = (unsigned long)__end_rodata;
    if (start & (PAGE_SIZE - 1)) {
    - pr_err("start of .rodata is not page size aligned\n");
    - return;
    + pr_err("%s: start of data is not page size aligned\n",
    + data_type);
    + return false;
    }
    if (end & (PAGE_SIZE - 1)) {
    - pr_err("end of .rodata is not page size aligned\n");
    - return;
    + pr_err("%s: end of data is not page size aligned\n",
    + data_type);
    + return false;
    }
    + pr_info("%s tests were successful", data_type);
    + return true;
    +}

    - pr_info("all tests were successful\n");
    +void rodata_test(void)
    +{
    + test_data("rodata", &rodata_test_data,
    + (unsigned long)&__start_rodata,
    + (unsigned long)&__end_rodata);
    }
    --
    2.19.1
    \
     
     \ /
      Last update: 2019-02-13 23:43    [W:3.070 / U:0.628 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site