From b3c31ebe636af98bdf8eb8ffcfeac8913b0158ff Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 16 Jun 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-06-16 --- gnot/trap.c | 13 ++++--------- pc/trap.c | 13 ++++--------- port/fault.c | 18 +++++++++++++----- port/portfns.h | 1 + power/trap.c | 13 ++++--------- ss/trap.c | 13 ++++--------- 6 files changed, 30 insertions(+), 41 deletions(-) diff --git a/gnot/trap.c b/gnot/trap.c index 75561751b5d31f8bc200fde3cb6e14c21a7d66a5..c3c956b3a65a7e100e150de8f8fe357b496a339d 100644 --- a/gnot/trap.c +++ b/gnot/trap.c @@ -193,14 +193,12 @@ notify(Ureg *ur) u->svsr = ur->sr; sp = ur->usp; sp -= sizeof(Ureg); - if(waserror()){ - pprint("suicide: trap in notify\n"); + if(!okaddr((ulong)u->notify, 1, 0) + || !okaddr(sp-ERRLEN-3*BY2WD, sizeof(Ureg)+ERRLEN-3*BY2WD, 0)){ + pprint("suicide: bad address in notify\n"); qunlock(&u->p->debug); pexit("Suicide", 0); } - validaddr((ulong)u->notify, 1, 0); - validaddr(sp-ERRLEN-3*BY2WD, sizeof(Ureg)+ERRLEN-3*BY2WD, 0); - poperror(); u->ureg = (void*)sp; memmove((Ureg*)sp, ur, sizeof(Ureg)); sp -= ERRLEN; @@ -246,14 +244,11 @@ noted(Ureg *ur, ulong arg0) memmove(ur, u->ureg, sizeof(Ureg)); switch(arg0){ case NCONT: - if(waserror()){ + if(!okaddr(nur->pc, 1, 0) || !okaddr(nur->usp, BY2WD, 0)){ pprint("suicide: trap in noted\n"); qunlock(&u->p->debug); goto Die; } - validaddr(nur->pc, 1, 0); - validaddr(nur->usp, BY2WD, 0); - poperror(); splhi(); qunlock(&u->p->debug); rfnote(ur); diff --git a/pc/trap.c b/pc/trap.c index c18a8b750ee490b86d0654c53e46294b6a5939e1..b33b38c2764652b0e0ce176cbebb61141304695d 100644 --- a/pc/trap.c +++ b/pc/trap.c @@ -404,14 +404,12 @@ notify(Ureg *ur) u->svflags = ur->flags; sp = ur->usp; sp -= sizeof(Ureg); - if(waserror()){ - pprint("suicide: trap in notify\n"); + if(!okaddr((ulong)u->notify, 1, 0) + || !okaddr(sp-ERRLEN-3*BY2WD, sizeof(Ureg)+ERRLEN-3*BY2WD, 0)){ + pprint("suicide: bad address in notify\n"); qunlock(&u->p->debug); pexit("Suicide", 0); } - validaddr((ulong)u->notify, 1, 0); - validaddr(sp-ERRLEN-3*BY2WD, sizeof(Ureg)+ERRLEN-3*BY2WD, 0); - poperror(); u->ureg = (void*)sp; memmove((Ureg*)sp, ur, sizeof(Ureg)); sp -= ERRLEN; @@ -459,14 +457,11 @@ noted(Ureg *ur, ulong arg0) memmove(ur, nur, sizeof(Ureg)); switch(arg0){ case NCONT: - if(waserror()){ + if(!okaddr(nur->pc, 1, 0) || !okaddr(nur->usp, BY2WD, 0)){ pprint("suicide: trap in noted\n"); qunlock(&u->p->debug); goto Die; } - validaddr(nur->pc, 1, 0); /* check for valid pc & usp */ - validaddr(nur->usp, BY2WD, 0); - poperror(); qunlock(&u->p->debug); return; diff --git a/port/fault.c b/port/fault.c index 67edff17f5563ef5a43e36a1a40680f3164bf171..dd98e57d9c7b8c96f11da3ece5ba69b9df4a2425 100644 --- a/port/fault.c +++ b/port/fault.c @@ -277,8 +277,8 @@ faulterror(char *s) /* * Called only in a system call */ -void -validaddr(ulong addr, ulong len, int write) +int +okaddr(ulong addr, ulong len, int write) { Segment *s; @@ -293,12 +293,20 @@ validaddr(ulong addr, ulong len, int write) addr = s->top; continue; } - return; + return 1; } } + pprint("suicide: invalid address 0x%lux in sys call pc=0x%.8lux\n", addr, userpc()); + return 0; +} + +void +validaddr(ulong addr, ulong len, int write) +{ + Segment *s; - pprint("invalid address 0x%lux in sys call pc=0x%lux", addr, userpc()); - error(Ebadarg); + if(!okaddr(addr, len, write)) + pexit("Suicide", 0); } /* diff --git a/port/portfns.h b/port/portfns.h index 4c979ccb285f057392542b203fd5c2dc47bd0136..4f42a542cfead5f67773007580dcd24981c01333 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -147,6 +147,7 @@ int nodelims(Stream*); int notify(Ureg*); int nrand(int); void nullput(Queue*, Block*); +int okaddr(ulong, ulong, int); int openmode(ulong); Block* padb(Block*, int); void pageinit(void); diff --git a/power/trap.c b/power/trap.c index da90224464aab56eaa89eb20173b1491fc697a83..7b8a7c5bc13775eca3a5cad16eed71b70ce50b46 100644 --- a/power/trap.c +++ b/power/trap.c @@ -411,14 +411,12 @@ notify(Ureg *ur) u->svstatus = ur->status; sp = ur->usp; sp -= sizeof(Ureg); - if(waserror()){ - pprint("suicide: trap in notify\n"); + if(!okaddr((ulong)u->notify, 1, 0) + || !okaddr(sp-ERRLEN-3*BY2WD, sizeof(Ureg)+ERRLEN-3*BY2WD, 0)){ + pprint("suicide: bad address in notify\n"); qunlock(&u->p->debug); pexit("Suicide", 0); } - validaddr((ulong)u->notify, 1, 0); - validaddr(sp-ERRLEN-3*BY2WD, sizeof(Ureg)+ERRLEN-3*BY2WD, 0); - poperror(); u->ureg = (void*)sp; memmove((Ureg*)sp, ur, sizeof(Ureg)); sp -= ERRLEN; @@ -465,14 +463,11 @@ noted(Ureg **urp, ulong arg0) (*urp)->r1 = u->svr1; switch(arg0){ case NCONT: - if(waserror()){ + if(!okaddr(nur->pc, 1, 0) || !okaddr(nur->usp, BY2WD, 0)){ pprint("suicide: trap in noted\n"); qunlock(&u->p->debug); goto Die; } - validaddr(nur->pc, 1, 0); - validaddr(nur->usp, BY2WD, 0); - poperror(); splhi(); qunlock(&u->p->debug); rfnote(urp); diff --git a/ss/trap.c b/ss/trap.c index 543a5a8d2aa37c5237552243379e88f479891cda..92d1d4b46fe20c4903be1883ffc1f040b6fcdf18 100644 --- a/ss/trap.c +++ b/ss/trap.c @@ -263,14 +263,12 @@ notify(Ureg *ur) u->svpsr = ur->psr; sp = ur->usp; sp -= sizeof(Ureg); - if(waserror()){ - pprint("suicide: trap in notify\n"); + if(!okaddr((ulong)u->notify, 1, 0) + || !okaddr(sp-ERRLEN-3*BY2WD, sizeof(Ureg)+ERRLEN-3*BY2WD, 0)){ + pprint("suicide: bad address in notify\n"); qunlock(&u->p->debug); pexit("Suicide", 0); } - validaddr((ulong)u->notify, 1, 0); - validaddr(sp-ERRLEN-3*BY2WD, sizeof(Ureg)+ERRLEN-3*BY2WD, 0); - poperror(); u->ureg = (void*)sp; memmove((Ureg*)sp, ur, sizeof(Ureg)); sp -= ERRLEN; @@ -319,14 +317,11 @@ noted(Ureg **urp, ulong arg0) (*urp)->r7 = u->svr7; switch(arg0){ case NCONT: - if(waserror()){ + if(!okaddr(nur->pc, 1, 0) || !okaddr(nur->usp, BY2WD, 0)){ pprint("suicide: trap in noted\n"); qunlock(&u->p->debug); goto Die; } - validaddr(nur->pc, 1, 0); - validaddr(nur->usp, BY2WD, 0); - poperror(); splhi(); qunlock(&u->p->debug); rfnote(urp);