History

posix-timers: Protect posix clock array access against speculation

The clockid argument of clockid_to_kclock() comes straight from user space via various syscalls and is used as index into the posix_clocks array. Protect it against spectre v1 array out of bounds speculation. Remove the redundant check for !posix_clock[id] as this is another source for speculation and does not provide any advantage over the return posix_clock[id] path which returns NULL in that case anyway.

Thomas Gleixner committed 8 years ago

Commit 19b558d1 parent 1b5f3ba1 file · +8 −3Browse files

Showing the changes to kernel (1 of 1 file). Show all

Unified · Split

kernel/time/posix-timers.c+8−3
@@ -50,6 +50,7 @@ · 49 unmodified lines
5050 #include <linux/export.h>
5151 #include <linux/hashtable.h>
5252 #include <linux/compat.h>
53+#include <linux/nospec.h>
5354
5455 #include "timekeeping.h"
5556 #include "posix-timers.h"
@@ -1346,11 +1347,15 @@ static const struct k_clock * const posix_clocks[] = { · 1290 unmodified lines
13461347
13471348 static const struct k_clock *clockid_to_kclock(const clockid_t id)
13481349 {
1349− if (id < 0)
1350+ clockid_t idx = id;
1351+
1352+ if (id < 0) {
13501353 return (id & CLOCKFD_MASK) == CLOCKFD ?
13511354 &clock_posix_dynamic : &clock_posix_cpu;
1355+ }
13521356
1353− if (id >= ARRAY_SIZE(posix_clocks) || !posix_clocks[id])
1357+ if (id >= ARRAY_SIZE(posix_clocks))
13541358 return NULL;
1355− return posix_clocks[id];
1359+
1360+ return posix_clocks[array_index_nospec(idx, ARRAY_SIZE(posix_clocks))];
13561361 }

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t