On Fri, Oct 27, 2023 at 09:36:25AM -0600, Theo de Raadt wrote: > Index: sys/arch/m88k/m88k/trap.c > =================================================================== > RCS file: /cvs/src/sys/arch/m88k/m88k/trap.c,v > diff -u -p -u -r1.128 trap.c > --- sys/arch/m88k/m88k/trap.c 2 Aug 2023 06:14:46 -0000 1.128 > +++ sys/arch/m88k/m88k/trap.c 27 Oct 2023 03:17:47 -0000 > @@ -1153,9 +1153,9 @@ void > m88100_syscall(register_t code, struct trapframe *tf) > { > int i, nap; > - const struct sysent *callp; > + const struct sysent *callp = sysent; > struct proc *p = curproc; > - int error, indirect = -1; > + int error; > register_t args[8] __aligned(8); > register_t rval[2] __aligned(8); > register_t *ap; > @@ -1172,19 +1172,9 @@ m88100_syscall(register_t code, struct t > ap = &tf->tf_r[2]; > nap = 8; /* r2-r9 */ > > - switch (code) { > - case SYS_syscall: > - indirect = code; > - code = *ap++; > - nap--; > - break; > - } > - > - callp = sysent; > - if (code < 0 || code >= SYS_MAXSYSCALL) > - callp += SYS_syscall; > - else > - callp += code; > + if (code <= 0 || code >= SYS_MAXSYSCALL) > + goto bad; > + callp += code; > > i = callp->sy_argsize / sizeof(register_t); > if (i > sizeof(args) / sizeof(register_t)) > @@ -1200,7 +1190,7 @@ m88100_syscall(register_t code, struct t > rval[0] = 0; > rval[1] = tf->tf_r[3]; > > - error = mi_syscall(p, code, indirect, callp, args, rval); > + error = mi_syscall(p, code, callp, args, rval); > > /* > * system call will look like: > @@ -1266,7 +1256,7 @@ void > m88110_syscall(register_t code, struct trapframe *tf) > { > int i, nap; > - const struct sysent *callp; > + const struct sysent *callp = sysent; > struct proc *p = curproc; > int error; > register_t args[8] __aligned(8); > @@ -1285,17 +1275,8 @@ m88110_syscall(register_t code, struct t > ap = &tf->tf_r[2]; > nap = 8; /* r2-r9 */ > > - switch (code) { > - case SYS_syscall: > - code = *ap++; > - nap--; > - break; > - } > - > - callp = sysent; > - if (code < 0 || code >= SYS_MAXSYSCALL) > - callp += SYS_syscall; > - else > + // XXX out of range stays on syscall0, which we assume is enosys > + if (code >= 0 || code <= SYS_MAXSYSCALL) > callp += code; > > i = callp->sy_argsize / sizeof(register_t);
Shouldn't this be if (code > 0 && code < SYS_MAXSYSCALL) ? All the other places in the diff modify callp under that condition. Also all the values of code >= SYS_MAXSYSCALL will be covered by code >= 0. Out of curiosity, any reason why m88k doesn't do the goto bad early on? Other than RTFM for the calling convention. > Index: sys/arch/mips64/mips64/trap.c > =================================================================== > RCS file: /cvs/src/sys/arch/mips64/mips64/trap.c,v > diff -u -p -u -r1.167 trap.c > --- sys/arch/mips64/mips64/trap.c 26 Apr 2023 16:53:59 -0000 1.167 > +++ sys/arch/mips64/mips64/trap.c 27 Oct 2023 03:17:44 -0000 > @@ -396,14 +396,12 @@ fault_common_no_miss: > case T_SYSCALL+T_USER: > { > struct trapframe *locr0 = p->p_md.md_regs; > - const struct sysent *callp; > - unsigned int code, indirect = -1; > + const struct sysent *callp = sysent; > + unsigned int code; > register_t tpc; > uint32_t branch = 0; > int error, numarg; > - struct args { > - register_t i[8]; > - } args; > + register_t args[8]; > register_t rval[2]; > > atomic_inc_int(&uvmexp.syscalls); > @@ -422,51 +420,22 @@ fault_common_no_miss: > trapframe->pc, 0, branch); > } else > locr0->pc += 4; > - callp = sysent; > code = locr0->v0; > - switch (code) { > - case SYS_syscall: > - /* > - * Code is first argument, followed by actual args. > - */ > - indirect = code; > - code = locr0->a0; > - if (code >= SYS_MAXSYSCALL) > - callp += SYS_syscall; > - else > - callp += code; > - numarg = callp->sy_argsize / sizeof(register_t); > - args.i[0] = locr0->a1; > - args.i[1] = locr0->a2; > - args.i[2] = locr0->a3; > - if (numarg > 3) { > - args.i[3] = locr0->a4; > - args.i[4] = locr0->a5; > - args.i[5] = locr0->a6; > - args.i[6] = locr0->a7; > - if (numarg > 7) > - if ((error = copyin((void *)locr0->sp, > - &args.i[7], sizeof(register_t)))) > - goto bad; > - } > - break; > - default: > - if (code >= SYS_MAXSYSCALL) > - callp += SYS_syscall; > - else > - callp += code; > - > - numarg = callp->sy_narg; > - args.i[0] = locr0->a0; > - args.i[1] = locr0->a1; > - args.i[2] = locr0->a2; > - args.i[3] = locr0->a3; > - if (numarg > 4) { > - args.i[4] = locr0->a4; > - args.i[5] = locr0->a5; > - args.i[6] = locr0->a6; > - args.i[7] = locr0->a7; > - } > + > + if (code <= 0 || code >= SYS_MAXSYSCALL) > + goto bad; > + callp += code; > + > + numarg = callp->sy_narg; > + args[0] = locr0->a0; > + args[1] = locr0->a1; > + args[2] = locr0->a2; > + args[3] = locr0->a3; > + if (numarg > 4) { > + args[4] = locr0->a4; > + args[5] = locr0->a5; > + args[6] = locr0->a6; > + args[7] = locr0->a7; > } > > rval[0] = 0; > @@ -477,29 +446,24 @@ fault_common_no_miss: > TRAPSIZE : trppos[ci->ci_cpuid]) - 1].code = code; > #endif > > - error = mi_syscall(p, code, indirect, callp, args.i, rval); > + error = mi_syscall(p, code, callp, args, rval); > > switch (error) { > case 0: > locr0->v0 = rval[0]; > locr0->a3 = 0; > break; > - > case ERESTART: > locr0->pc = tpc; > break; > - > case EJUSTRETURN: > break; /* nothing to do */ > - > default: > - bad: Previous chunk gotos bad. > locr0->v0 = error; > locr0->a3 = 1; > } > > mi_syscall_return(p, code, error, rval); > - > return; > } >