Fix syscall number bounds check computations.
authormiod <miod@openbsd.org>
Wed, 13 Dec 2023 15:57:22 +0000 (15:57 +0000)
committermiod <miod@openbsd.org>
Wed, 13 Dec 2023 15:57:22 +0000 (15:57 +0000)
12 files changed:
sys/arch/alpha/alpha/trap.c
sys/arch/arm/arm/syscall.c
sys/arch/arm64/arm64/syscall.c
sys/arch/hppa/hppa/trap.c
sys/arch/i386/i386/trap.c
sys/arch/m88k/m88k/trap.c
sys/arch/mips64/mips64/trap.c
sys/arch/powerpc/powerpc/trap.c
sys/arch/powerpc64/powerpc64/syscall.c
sys/arch/riscv64/riscv64/syscall.c
sys/arch/sh/sh/trap.c
sys/arch/sparc64/sparc64/trap.c

index fc697aa..c5d57de 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: trap.c,v 1.109 2023/12/12 15:30:55 deraadt Exp $ */
+/* $OpenBSD: trap.c,v 1.110 2023/12/13 15:57:22 miod Exp $ */
 /* $NetBSD: trap.c,v 1.52 2000/05/24 16:48:33 thorpej Exp $ */
 
 /*-
@@ -514,7 +514,7 @@ syscall(u_int64_t code, struct trapframe *framep)
        opc = framep->tf_regs[FRAME_PC] - 4;
 
        // XXX out of range stays on syscall0, which we assume is enosys
-       if (code >= 0 || code <= SYS_MAXSYSCALL)
+       if (code > 0 && code < SYS_MAXSYSCALL)
                callp += code;
 
        nargs = callp->sy_narg;
index 3879834..0252626 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: syscall.c,v 1.27 2023/12/12 15:30:55 deraadt Exp $    */
+/*     $OpenBSD: syscall.c,v 1.28 2023/12/13 15:57:22 miod Exp $       */
 /*     $NetBSD: syscall.c,v 1.24 2003/11/14 19:03:17 scw Exp $ */
 
 /*-
@@ -114,7 +114,7 @@ swi_handler(trapframe_t *frame)
 
        code = frame->tf_r12;
        // XXX out of range stays on syscall0, which we assume is enosys
-       if (code >= 0 || code <= SYS_MAXSYSCALL)
+       if (code > 0 && code < SYS_MAXSYSCALL)
                callp += code;
 
        nargs = callp->sy_argsize / sizeof(register_t);
index 7a9c1b6..675423d 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: syscall.c,v 1.16 2023/12/12 23:43:35 deraadt Exp $ */
+/* $OpenBSD: syscall.c,v 1.17 2023/12/13 15:57:22 miod Exp $ */
 /*
  * Copyright (c) 2015 Dale Rahn <drahn@dalerahn.com>
  *
@@ -50,7 +50,7 @@ svc_handler(trapframe_t *frame)
 
        ap = &frame->tf_x[0];
 
-       if (code < 0 || code >= SYS_MAXSYSCALL)
+       if (code <= 0 || code >= SYS_MAXSYSCALL)
                goto bad;
 
        callp = sysent + code;
index 09af95b..f6ec775 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: trap.c,v 1.163 2023/12/13 11:20:18 miod Exp $ */
+/*     $OpenBSD: trap.c,v 1.164 2023/12/13 15:57:22 miod Exp $ */
 
 /*
  * Copyright (c) 1998-2004 Michael Shalayeff
@@ -786,7 +786,7 @@ syscall(struct trapframe *frame)
        args[3] = frame->tf_arg3;
 
        // XXX out of range stays on syscall0, which we assume is enosys
-       if (code >= 0 || code <= SYS_MAXSYSCALL)
+       if (code > 0 && code < SYS_MAXSYSCALL)
                callp += code;
 
        if ((argsize = callp->sy_argsize)) {
index 69860df..73634e2 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: trap.c,v 1.163 2023/12/12 15:30:55 deraadt Exp $      */
+/*     $OpenBSD: trap.c,v 1.164 2023/12/13 15:57:22 miod Exp $ */
 /*     $NetBSD: trap.c,v 1.95 1996/05/05 06:50:02 mycroft Exp $        */
 
 /*-
@@ -544,7 +544,7 @@ syscall(struct trapframe *frame)
 
        code = frame->tf_eax;
        // XXX out of range stays on syscall0, which we assume is enosys
-       if (code >= 0 || code <= SYS_MAXSYSCALL)
+       if (code > 0 && code < SYS_MAXSYSCALL)
                callp += code;
 
        argsize = callp->sy_argsize;
index fc37bc4..7e0501c 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: trap.c,v 1.129 2023/12/12 15:30:56 deraadt Exp $      */
+/*     $OpenBSD: trap.c,v 1.130 2023/12/13 15:57:22 miod Exp $ */
 /*
  * Copyright (c) 2004, Miodrag Vallat.
  * Copyright (c) 1998 Steve Murphree, Jr.
@@ -1173,7 +1173,7 @@ m88100_syscall(register_t code, struct trapframe *tf)
        nap = 8; /* r2-r9 */
 
        // XXX out of range stays on syscall0, which we assume is enosys
-       if (code >= 0 || code <= SYS_MAXSYSCALL)
+       if (code > 0 && code < SYS_MAXSYSCALL)
                callp += code;
 
        i = callp->sy_argsize / sizeof(register_t);
@@ -1276,7 +1276,7 @@ m88110_syscall(register_t code, struct trapframe *tf)
        nap = 8;        /* r2-r9 */
 
        // XXX out of range stays on syscall0, which we assume is enosys
-       if (code >= 0 || code <= SYS_MAXSYSCALL)
+       if (code > 0 && code < SYS_MAXSYSCALL)
                callp += code;
 
        i = callp->sy_argsize / sizeof(register_t);
index 5169bfe..5fa9c7e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: trap.c,v 1.169 2023/12/13 02:31:15 deraadt Exp $      */
+/*     $OpenBSD: trap.c,v 1.170 2023/12/13 15:57:22 miod Exp $ */
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -425,7 +425,7 @@ fault_common_no_miss:
                code = locr0->v0;
 
                // XXX out of range stays on syscall0, which we assume is enosys
-               if (code >= 0 || code <= SYS_MAXSYSCALL)
+               if (code > 0 && code < SYS_MAXSYSCALL)
                        callp += code;
 
                numarg = callp->sy_narg;
index bd20eb4..80931f9 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: trap.c,v 1.132 2023/12/12 15:30:56 deraadt Exp $      */
+/*     $OpenBSD: trap.c,v 1.133 2023/12/13 15:57:22 miod Exp $ */
 /*     $NetBSD: trap.c,v 1.3 1996/10/13 03:31:37 christos Exp $        */
 
 /*
@@ -364,7 +364,7 @@ trap(struct trapframe *frame)
 
                code = frame->fixreg[0];
                // XXX out of range stays on syscall0, which we assume is enosys
-               if (code >= 0 || code <= SYS_MAXSYSCALL)
+               if (code > 0 && code < SYS_MAXSYSCALL)
                        callp += code;
 
                argsize = callp->sy_argsize;
index d252745..3d60de8 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: syscall.c,v 1.12 2023/12/12 15:30:56 deraadt Exp $    */
+/*     $OpenBSD: syscall.c,v 1.13 2023/12/13 15:57:22 miod Exp $       */
 
 /*
  * Copyright (c) 2015 Dale Rahn <drahn@dalerahn.com>
@@ -39,7 +39,7 @@ syscall(struct trapframe *frame)
 
        code = frame->fixreg[0];
        // XXX out of range stays on syscall0, which we assume is enosys
-       if (code >= 0 || code <= SYS_MAXSYSCALL)
+       if (code > 0 && code < SYS_MAXSYSCALL)
                callp += code;
 
        nargs = callp->sy_argsize / sizeof(register_t);
index ed5e534..2c02730 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: syscall.c,v 1.17 2023/12/12 15:30:56 deraadt Exp $    */
+/*     $OpenBSD: syscall.c,v 1.18 2023/12/13 15:57:22 miod Exp $       */
 
 /*
  * Copyright (c) 2020 Brian Bamsch <bbamsch@google.com>
@@ -50,7 +50,7 @@ svc_handler(trapframe_t *frame)
        code = frame->tf_t[0];
 
        // XXX out of range stays on syscall0, which we assume is enosys
-       if (code >= 0 || code <= SYS_MAXSYSCALL)
+       if (code > 0 && code < SYS_MAXSYSCALL)
                callp += code;
 
        nargs = callp->sy_argsize / sizeof(register_t);
index 436a952..214dfd9 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: trap.c,v 1.56 2023/12/13 12:41:31 miod Exp $  */
+/*     $OpenBSD: trap.c,v 1.57 2023/12/13 15:57:22 miod Exp $  */
 /*     $NetBSD: exception.c,v 1.32 2006/09/04 23:57:52 uwe Exp $       */
 /*     $NetBSD: syscall.c,v 1.6 2006/03/07 07:21:50 thorpej Exp $      */
 
@@ -527,7 +527,7 @@ syscall(struct proc *p, struct trapframe *tf)
 
        code = tf->tf_r0;
        // XXX out of range stays on syscall0, which we assume is enosys
-       if (code >= 0 || code <= SYS_MAXSYSCALL)
+       if (code > 0 && code < SYS_MAXSYSCALL)
                callp += code;
 
        argsize = callp->sy_argsize;
index cfaa0b4..deb4c52 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: trap.c,v 1.117 2023/12/12 23:43:35 deraadt Exp $      */
+/*     $OpenBSD: trap.c,v 1.118 2023/12/13 15:57:22 miod Exp $ */
 /*     $NetBSD: trap.c,v 1.73 2001/08/09 01:03:01 eeh Exp $ */
 
 /*
@@ -1138,7 +1138,7 @@ syscall(struct trapframe *tf, register_t code, register_t pc)
        ap = &tf->tf_out[0];
        nap = 6;
 
-       if (code < 0 || code >= SYS_MAXSYSCALL)
+       if (code <= 0 || code >= SYS_MAXSYSCALL)
                goto bad;
        callp = sysent + code;
        i = callp->sy_narg; /* Why divide? */