diff options
author | mischief <mischief@offblast.org> | 2014-02-06 18:03:17 -0800 |
---|---|---|
committer | mischief <mischief@offblast.org> | 2014-02-06 18:03:17 -0800 |
commit | fc7f6f8e99d9db307883448a49a1e3d6243d04cf (patch) | |
tree | bdd07550a1c82403d9170bad1ef5ebe1338d57b3 /sys/src/9/pc64/trap.c | |
parent | 0fdb1578ef610846a231036d74b65716e75f6927 (diff) |
pc64: ensure user pc is never set to a non-canonical address through setregisters
on intel processors, a general protection exception is fired if a non-canonical address is loaded into PC during SYSRET. this will cause the kernel to panic.
see http://www.kb.cert.org/vuls/id/649219 and the intel software developer manual for more information.
Diffstat (limited to 'sys/src/9/pc64/trap.c')
-rw-r--r-- | sys/src/9/pc64/trap.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/sys/src/9/pc64/trap.c b/sys/src/9/pc64/trap.c index 41a8c4978..6b2154c3f 100644 --- a/sys/src/9/pc64/trap.c +++ b/sys/src/9/pc64/trap.c @@ -992,6 +992,7 @@ setregisters(Ureg* ureg, char* pureg, char* uva, int n) if(ureg->gs != UDSEL) ureg->gs = 0; ureg->flags = (ureg->flags & 0x00ff) | (flags & 0xff00); + ureg->pc &= UADDRMASK; } static void |