Skip to content

Commit 73f62e6

Browse files
committed
lkdtm: Move crashtype definitions into each category
It's long been annoying that to add a new LKDTM test one had to update lkdtm.h and core.c to get it "registered". Switch to a per-category list and update the crashtype walking code in core.c to handle it. This also means that all the lkdtm_* tests themselves can be static now. Cc: Arnd Bergmann <[email protected]> Cc: Greg Kroah-Hartman <[email protected]> Signed-off-by: Kees Cook <[email protected]>
1 parent 8bfdbdd commit 73f62e6

File tree

11 files changed

+301
-292
lines changed

11 files changed

+301
-292
lines changed

drivers/misc/lkdtm/bugs.c

Lines changed: 60 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -68,40 +68,40 @@ void __init lkdtm_bugs_init(int *recur_param)
6868
recur_count = *recur_param;
6969
}
7070

71-
void lkdtm_PANIC(void)
71+
static void lkdtm_PANIC(void)
7272
{
7373
panic("dumptest");
7474
}
7575

76-
void lkdtm_BUG(void)
76+
static void lkdtm_BUG(void)
7777
{
7878
BUG();
7979
}
8080

8181
static int warn_counter;
8282

83-
void lkdtm_WARNING(void)
83+
static void lkdtm_WARNING(void)
8484
{
8585
WARN_ON(++warn_counter);
8686
}
8787

88-
void lkdtm_WARNING_MESSAGE(void)
88+
static void lkdtm_WARNING_MESSAGE(void)
8989
{
9090
WARN(1, "Warning message trigger count: %d\n", ++warn_counter);
9191
}
9292

93-
void lkdtm_EXCEPTION(void)
93+
static void lkdtm_EXCEPTION(void)
9494
{
9595
*((volatile int *) 0) = 0;
9696
}
9797

98-
void lkdtm_LOOP(void)
98+
static void lkdtm_LOOP(void)
9999
{
100100
for (;;)
101101
;
102102
}
103103

104-
void lkdtm_EXHAUST_STACK(void)
104+
static void lkdtm_EXHAUST_STACK(void)
105105
{
106106
pr_info("Calling function with %lu frame size to depth %d ...\n",
107107
REC_STACK_SIZE, recur_count);
@@ -115,7 +115,7 @@ static noinline void __lkdtm_CORRUPT_STACK(void *stack)
115115
}
116116

117117
/* This should trip the stack canary, not corrupt the return address. */
118-
noinline void lkdtm_CORRUPT_STACK(void)
118+
static noinline void lkdtm_CORRUPT_STACK(void)
119119
{
120120
/* Use default char array length that triggers stack protection. */
121121
char data[8] __aligned(sizeof(void *));
@@ -125,7 +125,7 @@ noinline void lkdtm_CORRUPT_STACK(void)
125125
}
126126

127127
/* Same as above but will only get a canary with -fstack-protector-strong */
128-
noinline void lkdtm_CORRUPT_STACK_STRONG(void)
128+
static noinline void lkdtm_CORRUPT_STACK_STRONG(void)
129129
{
130130
union {
131131
unsigned short shorts[4];
@@ -139,7 +139,7 @@ noinline void lkdtm_CORRUPT_STACK_STRONG(void)
139139
static pid_t stack_pid;
140140
static unsigned long stack_addr;
141141

142-
void lkdtm_REPORT_STACK(void)
142+
static void lkdtm_REPORT_STACK(void)
143143
{
144144
volatile uintptr_t magic;
145145
pid_t pid = task_pid_nr(current);
@@ -222,15 +222,15 @@ static noinline void __lkdtm_REPORT_STACK_CANARY(void *stack)
222222
}
223223
}
224224

225-
void lkdtm_REPORT_STACK_CANARY(void)
225+
static void lkdtm_REPORT_STACK_CANARY(void)
226226
{
227227
/* Use default char array length that triggers stack protection. */
228228
char data[8] __aligned(sizeof(void *)) = { };
229229

230230
__lkdtm_REPORT_STACK_CANARY((void *)&data);
231231
}
232232

233-
void lkdtm_UNALIGNED_LOAD_STORE_WRITE(void)
233+
static void lkdtm_UNALIGNED_LOAD_STORE_WRITE(void)
234234
{
235235
static u8 data[5] __attribute__((aligned(4))) = {1, 2, 3, 4, 5};
236236
u32 *p;
@@ -245,29 +245,29 @@ void lkdtm_UNALIGNED_LOAD_STORE_WRITE(void)
245245
pr_err("XFAIL: arch has CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS\n");
246246
}
247247

248-
void lkdtm_SOFTLOCKUP(void)
248+
static void lkdtm_SOFTLOCKUP(void)
249249
{
250250
preempt_disable();
251251
for (;;)
252252
cpu_relax();
253253
}
254254

255-
void lkdtm_HARDLOCKUP(void)
255+
static void lkdtm_HARDLOCKUP(void)
256256
{
257257
local_irq_disable();
258258
for (;;)
259259
cpu_relax();
260260
}
261261

262-
void lkdtm_SPINLOCKUP(void)
262+
static void lkdtm_SPINLOCKUP(void)
263263
{
264264
/* Must be called twice to trigger. */
265265
spin_lock(&lock_me_up);
266266
/* Let sparse know we intended to exit holding the lock. */
267267
__release(&lock_me_up);
268268
}
269269

270-
void lkdtm_HUNG_TASK(void)
270+
static void lkdtm_HUNG_TASK(void)
271271
{
272272
set_current_state(TASK_UNINTERRUPTIBLE);
273273
schedule();
@@ -276,7 +276,7 @@ void lkdtm_HUNG_TASK(void)
276276
volatile unsigned int huge = INT_MAX - 2;
277277
volatile unsigned int ignored;
278278

279-
void lkdtm_OVERFLOW_SIGNED(void)
279+
static void lkdtm_OVERFLOW_SIGNED(void)
280280
{
281281
int value;
282282

@@ -291,7 +291,7 @@ void lkdtm_OVERFLOW_SIGNED(void)
291291
}
292292

293293

294-
void lkdtm_OVERFLOW_UNSIGNED(void)
294+
static void lkdtm_OVERFLOW_UNSIGNED(void)
295295
{
296296
unsigned int value;
297297

@@ -319,7 +319,7 @@ struct array_bounds {
319319
int three;
320320
};
321321

322-
void lkdtm_ARRAY_BOUNDS(void)
322+
static void lkdtm_ARRAY_BOUNDS(void)
323323
{
324324
struct array_bounds_flex_array *not_checked;
325325
struct array_bounds *checked;
@@ -357,7 +357,7 @@ void lkdtm_ARRAY_BOUNDS(void)
357357
pr_expected_config(CONFIG_UBSAN_BOUNDS);
358358
}
359359

360-
void lkdtm_CORRUPT_LIST_ADD(void)
360+
static void lkdtm_CORRUPT_LIST_ADD(void)
361361
{
362362
/*
363363
* Initially, an empty list via LIST_HEAD:
@@ -397,7 +397,7 @@ void lkdtm_CORRUPT_LIST_ADD(void)
397397
}
398398
}
399399

400-
void lkdtm_CORRUPT_LIST_DEL(void)
400+
static void lkdtm_CORRUPT_LIST_DEL(void)
401401
{
402402
LIST_HEAD(test_head);
403403
struct lkdtm_list item;
@@ -425,7 +425,7 @@ void lkdtm_CORRUPT_LIST_DEL(void)
425425
}
426426

427427
/* Test that VMAP_STACK is actually allocating with a leading guard page */
428-
void lkdtm_STACK_GUARD_PAGE_LEADING(void)
428+
static void lkdtm_STACK_GUARD_PAGE_LEADING(void)
429429
{
430430
const unsigned char *stack = task_stack_page(current);
431431
const unsigned char *ptr = stack - 1;
@@ -439,7 +439,7 @@ void lkdtm_STACK_GUARD_PAGE_LEADING(void)
439439
}
440440

441441
/* Test that VMAP_STACK is actually allocating with a trailing guard page */
442-
void lkdtm_STACK_GUARD_PAGE_TRAILING(void)
442+
static void lkdtm_STACK_GUARD_PAGE_TRAILING(void)
443443
{
444444
const unsigned char *stack = task_stack_page(current);
445445
const unsigned char *ptr = stack + THREAD_SIZE;
@@ -452,7 +452,7 @@ void lkdtm_STACK_GUARD_PAGE_TRAILING(void)
452452
pr_err("FAIL: accessed page after stack! (byte: %x)\n", byte);
453453
}
454454

455-
void lkdtm_UNSET_SMEP(void)
455+
static void lkdtm_UNSET_SMEP(void)
456456
{
457457
#if IS_ENABLED(CONFIG_X86_64) && !IS_ENABLED(CONFIG_UML)
458458
#define MOV_CR4_DEPTH 64
@@ -518,7 +518,7 @@ void lkdtm_UNSET_SMEP(void)
518518
#endif
519519
}
520520

521-
void lkdtm_DOUBLE_FAULT(void)
521+
static void lkdtm_DOUBLE_FAULT(void)
522522
{
523523
#if IS_ENABLED(CONFIG_X86_32) && !IS_ENABLED(CONFIG_UML)
524524
/*
@@ -566,7 +566,7 @@ static noinline void change_pac_parameters(void)
566566
}
567567
#endif
568568

569-
noinline void lkdtm_CORRUPT_PAC(void)
569+
static noinline void lkdtm_CORRUPT_PAC(void)
570570
{
571571
#ifdef CONFIG_ARM64
572572
#define CORRUPT_PAC_ITERATE 10
@@ -594,3 +594,37 @@ noinline void lkdtm_CORRUPT_PAC(void)
594594
pr_err("XFAIL: this test is arm64-only\n");
595595
#endif
596596
}
597+
598+
static struct crashtype crashtypes[] = {
599+
CRASHTYPE(PANIC),
600+
CRASHTYPE(BUG),
601+
CRASHTYPE(WARNING),
602+
CRASHTYPE(WARNING_MESSAGE),
603+
CRASHTYPE(EXCEPTION),
604+
CRASHTYPE(LOOP),
605+
CRASHTYPE(EXHAUST_STACK),
606+
CRASHTYPE(CORRUPT_STACK),
607+
CRASHTYPE(CORRUPT_STACK_STRONG),
608+
CRASHTYPE(REPORT_STACK),
609+
CRASHTYPE(REPORT_STACK_CANARY),
610+
CRASHTYPE(UNALIGNED_LOAD_STORE_WRITE),
611+
CRASHTYPE(SOFTLOCKUP),
612+
CRASHTYPE(HARDLOCKUP),
613+
CRASHTYPE(SPINLOCKUP),
614+
CRASHTYPE(HUNG_TASK),
615+
CRASHTYPE(OVERFLOW_SIGNED),
616+
CRASHTYPE(OVERFLOW_UNSIGNED),
617+
CRASHTYPE(ARRAY_BOUNDS),
618+
CRASHTYPE(CORRUPT_LIST_ADD),
619+
CRASHTYPE(CORRUPT_LIST_DEL),
620+
CRASHTYPE(STACK_GUARD_PAGE_LEADING),
621+
CRASHTYPE(STACK_GUARD_PAGE_TRAILING),
622+
CRASHTYPE(UNSET_SMEP),
623+
CRASHTYPE(DOUBLE_FAULT),
624+
CRASHTYPE(CORRUPT_PAC),
625+
};
626+
627+
struct crashtype_category bugs_crashtypes = {
628+
.crashtypes = crashtypes,
629+
.len = ARRAY_SIZE(crashtypes),
630+
};

drivers/misc/lkdtm/cfi.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ static noinline int lkdtm_increment_int(int *counter)
2222
/*
2323
* This tries to call an indirect function with a mismatched prototype.
2424
*/
25-
void lkdtm_CFI_FORWARD_PROTO(void)
25+
static void lkdtm_CFI_FORWARD_PROTO(void)
2626
{
2727
/*
2828
* Matches lkdtm_increment_void()'s prototype, but not
@@ -41,3 +41,12 @@ void lkdtm_CFI_FORWARD_PROTO(void)
4141
pr_err("FAIL: survived mismatched prototype function call!\n");
4242
pr_expected_config(CONFIG_CFI_CLANG);
4343
}
44+
45+
static struct crashtype crashtypes[] = {
46+
CRASHTYPE(CFI_FORWARD_PROTO),
47+
};
48+
49+
struct crashtype_category cfi_crashtypes = {
50+
.crashtypes = crashtypes,
51+
.len = ARRAY_SIZE(crashtypes),
52+
};

0 commit comments

Comments
 (0)