Fix nasty bug in exec*() code that can crash the machine.
authorMatthew Dillon <dillon@apollo.backplane.com>
Thu, 30 Jul 2009 18:33:36 +0000 (11:33 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Thu, 30 Jul 2009 18:33:36 +0000 (11:33 -0700)
Fix a case where the exec() would sometimes attempt to free a wild pointer,
placing it in the objcache and creating nasty kernel memory corruption.

Reported-by: Borislav Nikolov <none@venom.interbgc.com>
sys/emulation/linux/i386/linux_machdep.c
sys/kern/kern_exec.c

index 894c537..279ecea 100644 (file)
@@ -119,6 +119,7 @@ sys_linux_execve(struct linux_execve_args *args)
                kprintf(ARGS(execve, "%s"), path);
 #endif
        error = nlookup_init(&nd, path, UIO_SYSSPACE, NLC_FOLLOW);
+       bzero(&exec_args, sizeof(exec_args));
        if (error == 0) {
                error = exec_copyin_args(&exec_args, path, PATH_SYSSPACE,
                                        args->argp, args->envp);
index a3cdcfc..1247efa 100644 (file)
@@ -537,6 +537,7 @@ sys_execve(struct execve_args *uap)
        int error;
 
        error = nlookup_init(&nd, uap->fname, UIO_USERSPACE, NLC_FOLLOW);
+       bzero(&args, sizeof(args));
        if (error == 0) {
                error = exec_copyin_args(&args, uap->fname, PATH_USERSPACE,
                                        uap->argv, uap->envv);
@@ -754,8 +755,6 @@ exec_copyin_args(struct image_args *args, char *fname,
        int     error = 0;
        size_t  length;
 
-       bzero(args, sizeof(*args));
-
        args->buf = objcache_get(exec_objcache, M_WAITOK);
        if (args->buf == NULL)
                return (ENOMEM);