pc64: fix wrong Ureg* argument on note handler (thanks _sl!)
_sl reported crash: stats 593: suicide: sys: trap: fault write addr=0xffffffff8258d1b0 pc=0x204cc7 ; acid 593 /proc/593/text:amd64 plan 9 executable /sys/lib/acid/port /sys/lib/acid/amd64 acid: lstk() notejmp(ret=0x1,j=0x40ac90)+0x13 /sys/src/libc/amd64/notejmp.c:10 alarmed(a=0xffffffff8258d1b0,s=0x7ffffeffea58)+0x3f /sys/src/cmd/stats.c:718 notifier+0x3e /sys/src/libc/port/atnotify.c:15 acid: note how a in alarmed is a kernel address! the first Ureg* argument is passed to the note handler in the RARG (BX) register, which was not loaded when returning to userspace from syscall() thru forkret(). fix by returning thru noteret() from syscall().
This commit is contained in:
parent
7c1ae2ead3
commit
ca4f815cfc
1 changed files with 1 additions and 0 deletions
|
@ -769,6 +769,7 @@ syscall(Ureg* ureg)
|
|||
if(scallnr!=RFORK && (up->procctl || up->nnote)){
|
||||
splhi();
|
||||
notify(ureg);
|
||||
((void**)&ureg)[-1] = (void*)noteret; /* loads RARG */
|
||||
}
|
||||
/* if we delayed sched because we held a lock, sched now */
|
||||
if(up->delaysched)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue