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;
>           }
>  

Reply via email to