hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/misc/lkdtm/perms.c
....@@ -57,6 +57,7 @@
5757 }
5858 pr_info("attempting bad execution at %px\n", func);
5959 func();
60
+ pr_err("FAIL: func returned\n");
6061 }
6162
6263 static void execute_user_location(void *dst)
....@@ -75,20 +76,22 @@
7576 return;
7677 pr_info("attempting bad execution at %px\n", func);
7778 func();
79
+ pr_err("FAIL: func returned\n");
7880 }
7981
8082 void lkdtm_WRITE_RO(void)
8183 {
82
- /* Explicitly cast away "const" for the test. */
83
- unsigned long *ptr = (unsigned long *)&rodata;
84
+ /* Explicitly cast away "const" for the test and make volatile. */
85
+ volatile unsigned long *ptr = (unsigned long *)&rodata;
8486
8587 pr_info("attempting bad rodata write at %px\n", ptr);
8688 *ptr ^= 0xabcd1234;
89
+ pr_err("FAIL: survived bad write\n");
8790 }
8891
8992 void lkdtm_WRITE_RO_AFTER_INIT(void)
9093 {
91
- unsigned long *ptr = &ro_after_init;
94
+ volatile unsigned long *ptr = &ro_after_init;
9295
9396 /*
9497 * Verify we were written to during init. Since an Oops
....@@ -102,19 +105,21 @@
102105
103106 pr_info("attempting bad ro_after_init write at %px\n", ptr);
104107 *ptr ^= 0xabcd1234;
108
+ pr_err("FAIL: survived bad write\n");
105109 }
106110
107111 void lkdtm_WRITE_KERN(void)
108112 {
109113 size_t size;
110
- unsigned char *ptr;
114
+ volatile unsigned char *ptr;
111115
112116 size = (unsigned long)do_overwritten - (unsigned long)do_nothing;
113117 ptr = (unsigned char *)do_overwritten;
114118
115119 pr_info("attempting bad %zu byte write at %px\n", size, ptr);
116
- memcpy(ptr, (unsigned char *)do_nothing, size);
120
+ memcpy((void *)ptr, (unsigned char *)do_nothing, size);
117121 flush_icache_range((unsigned long)ptr, (unsigned long)(ptr + size));
122
+ pr_err("FAIL: survived bad write\n");
118123
119124 do_overwritten();
120125 }
....@@ -193,9 +198,11 @@
193198 pr_info("attempting bad read at %px\n", ptr);
194199 tmp = *ptr;
195200 tmp += 0xc0dec0de;
201
+ pr_err("FAIL: survived bad read\n");
196202
197203 pr_info("attempting bad write at %px\n", ptr);
198204 *ptr = tmp;
205
+ pr_err("FAIL: survived bad write\n");
199206
200207 vm_munmap(user_addr, PAGE_SIZE);
201208 }
....@@ -203,19 +210,20 @@
203210 void lkdtm_ACCESS_NULL(void)
204211 {
205212 unsigned long tmp;
206
- unsigned long *ptr = (unsigned long *)NULL;
213
+ volatile unsigned long *ptr = (unsigned long *)NULL;
207214
208215 pr_info("attempting bad read at %px\n", ptr);
209216 tmp = *ptr;
210217 tmp += 0xc0dec0de;
218
+ pr_err("FAIL: survived bad read\n");
211219
212220 pr_info("attempting bad write at %px\n", ptr);
213221 *ptr = tmp;
222
+ pr_err("FAIL: survived bad write\n");
214223 }
215224
216225 void __init lkdtm_perms_init(void)
217226 {
218227 /* Make sure we can write to __ro_after_init values during __init */
219228 ro_after_init |= 0xAA;
220
-
221229 }