lkdtm/stackleak: Make the test more verbose
authorAlexander Popov <alex.popov@linux.com>
Thu, 2 Jan 2020 23:49:07 +0000 (02:49 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 10 Feb 2020 21:43:38 +0000 (13:43 -0800)
Make the stack erasing test more verbose about the errors that it
can detect.

Signed-off-by: Alexander Popov <alex.popov@linux.com>
Cc: Kees Cook <keescook@chromium.org>
Link: https://lore.kernel.org/r/20200102234907.585508-1-alex.popov@linux.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/lkdtm/stackleak.c

index d5a0844..d1a5c07 100644 (file)
@@ -16,6 +16,7 @@ void lkdtm_STACKLEAK_ERASING(void)
        unsigned long *sp, left, found, i;
        const unsigned long check_depth =
                        STACKLEAK_SEARCH_DEPTH / sizeof(unsigned long);
+       bool test_failed = false;
 
        /*
         * For the details about the alignment of the poison values, see
@@ -34,7 +35,8 @@ void lkdtm_STACKLEAK_ERASING(void)
                left--;
        } else {
                pr_err("FAIL: not enough stack space for the test\n");
-               return;
+               test_failed = true;
+               goto end;
        }
 
        pr_info("checking unused part of the thread stack (%lu bytes)...\n",
@@ -52,22 +54,29 @@ void lkdtm_STACKLEAK_ERASING(void)
        }
 
        if (found <= check_depth) {
-               pr_err("FAIL: thread stack is not erased (checked %lu bytes)\n",
+               pr_err("FAIL: the erased part is not found (checked %lu bytes)\n",
                                                i * sizeof(unsigned long));
-               return;
+               test_failed = true;
+               goto end;
        }
 
-       pr_info("first %lu bytes are unpoisoned\n",
+       pr_info("the erased part begins after %lu not poisoned bytes\n",
                                (i - found) * sizeof(unsigned long));
 
        /* The rest of thread stack should be erased */
        for (; i < left; i++) {
                if (*(sp - i) != STACKLEAK_POISON) {
-                       pr_err("FAIL: thread stack is NOT properly erased\n");
-                       return;
+                       pr_err("FAIL: bad value number %lu in the erased part: 0x%lx\n",
+                                                               i, *(sp - i));
+                       test_failed = true;
                }
        }
 
-       pr_info("OK: the rest of the thread stack is properly erased\n");
-       return;
+end:
+       if (test_failed) {
+               pr_err("FAIL: the thread stack is NOT properly erased\n");
+               dump_stack();
+       } else {
+               pr_info("OK: the rest of the thread stack is properly erased\n");
+       }
 }