Date: Sun, 19 Sep 2004 23:05:14 +0200 From: gerarra@tin.it To: FreeBSD-hackers@freebsd.org Subject: Re: FreeBSD Kernel buffer overflow Message-ID: <4146316C0000B2DB@ims3a.cp.tin.it> In-Reply-To: <20040919165011.GA2907@gothmog.gr>
next in thread | previous in thread | raw e-mail | index | archive | help
>Don, > >This sounds excellent. Can an src-committer verify that the following is >ok and commit it along with the manpage diff I posted earlier to HEAD? > >The hard-wired number 8 in there seems like something that could probabl= y >be improved a lot, but after looking for a short while I couldn't find a >good way of finding out from the arguments of syscall_register() some wa= y >to calculate it. Of course, I'm far from an experienced kernel hacker and >I'm probably missing something. Feel free to correct the following diff= >or >even replace it entirely. Maybe you can get a look at this approach: =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D $arch/include/md_var.h: > cat md_var.diff --- md_var2.h Sun Sep 19 22:43:56 2004 +++ md_var.h Sun Sep 19 22:46:23 2004 @@ -41,6 +41,12 @@ extern int (*copyin_vector)(const void *udaddr, void *kaddr, size_t len); extern int (*copyout_vector)(const void *kaddr, void *udaddr, size_t= len); +/* + * Arguments number syscalls definition + */ + +#define MAGIC_SYSCALL_ARGS 8 + extern long Maxmem; extern u_int basemem; /* PA of original top of base memory */ extern int busdma_swi_pending; =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D kern/kern_syscall.c: > cat kern_syscall.diff --- kern_syscalls.c Sat Sep 18 13:42:21 2004 +++ kern_syscalls2.c Sun Sep 19 23:00:44 2004 @@ -27,6 +27,8 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD: src/sys/kern/kern_syscalls.c,v 1.11 2004/07/15 08:26= :05 phk Exp $"); +#include <machine/md_var.h> + #include <sys/param.h> #include <sys/sysproto.h> #include <sys/sysent.h> @@ -58,6 +60,9 @@ syscall_register(int *offset, struct sysent *new_sysent, struct sysent *old_sysent) { + if (new_sysent->sy_narg < 0 || new_sysent->sy_narg > MAGIC_SYSCAL= L_ARGS) + return EINVAL; + if (*offset =3D=3D NO_SYSCALL) { int i; =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D i386/i386/trap.c --- trap.c Sat Sep 18 14:30:19 2004 +++ trap2.c Sun Sep 19 22:47:33 2004 @@ -902,7 +902,7 @@ u_int sticks; int error; int narg; - int args[8]; + int args[MAGIC_SYSCALL_ARGS]; u_int code; /* The idea is that for every architecture MAGIC_SYSCALL_ARGS can be defined= in md_var.h (it's alredy included in handlers sources). Here just i386 ex= ample is done to show approach. It could be more flexible than a static approac= h. I hope you will enjoy it. rookie
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4146316C0000B2DB>