Module Name: src Committed By: christos Date: Tue Feb 21 04:13:22 UTC 2012
Modified Files: src/sys/kern: kern_exec.c Log Message: keep track of the original array length so we can pass it to kmem_free, from enami To generate a diff of this commit: cvs rdiff -u -r1.343 -r1.344 src/sys/kern/kern_exec.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/kern_exec.c diff -u src/sys/kern/kern_exec.c:1.343 src/sys/kern/kern_exec.c:1.344 --- src/sys/kern/kern_exec.c:1.343 Mon Feb 20 22:44:54 2012 +++ src/sys/kern/kern_exec.c Mon Feb 20 23:13:22 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_exec.c,v 1.343 2012/02/21 03:44:54 christos Exp $ */ +/* $NetBSD: kern_exec.c,v 1.344 2012/02/21 04:13:22 christos Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -59,7 +59,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_exec.c,v 1.343 2012/02/21 03:44:54 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_exec.c,v 1.344 2012/02/21 04:13:22 christos Exp $"); #include "opt_exec.h" #include "opt_ktrace.h" @@ -1917,10 +1917,10 @@ spawn_return(void *arg) } static void -posix_spawn_fa_free(struct posix_spawn_file_actions *fa) +posix_spawn_fa_free(struct posix_spawn_file_actions *fa, size_t len) { - for (size_t i = 0; i < fa->len; i++) { + for (size_t i = 0; i < len; i++) { struct posix_spawn_file_actions_entry *fae = &fa->fae[i]; if (fae->fae_action != FAE_OPEN) continue; @@ -1939,6 +1939,7 @@ posix_spawn_fa_alloc(struct posix_spawn_ struct posix_spawn_file_actions_entry *fae; char *pbuf = NULL; int error; + size_t i = 0; fa = kmem_alloc(sizeof(*fa), KM_SLEEP); error = copyin(ufa, fa, sizeof(*fa)); @@ -1955,21 +1956,17 @@ posix_spawn_fa_alloc(struct posix_spawn_ fae = fa->fae; fa->fae = kmem_alloc(fal, KM_SLEEP); error = copyin(fae, fa->fae, fal); - if (error) { - fa->len = 0; + if (error) goto out; - } pbuf = PNBUF_GET(); - for (size_t i = 0; i < fa->len; i++) { + for (; i < fa->len; i++) { fae = &fa->fae[i]; if (fae->fae_action != FAE_OPEN) continue; error = copyinstr(fae->fae_path, pbuf, MAXPATHLEN, &fal); - if (error) { - fa->len = i; + if (error) goto out; - } fae->fae_path = kmem_alloc(fal, KM_SLEEP); memcpy(fae->fae_path, pbuf, fal); } @@ -1979,7 +1976,7 @@ posix_spawn_fa_alloc(struct posix_spawn_ out: if (pbuf) PNBUF_PUT(pbuf); - posix_spawn_fa_free(fa); + posix_spawn_fa_free(fa, i); return error; } @@ -2281,7 +2278,7 @@ sys_posix_spawn(struct lwp *l1, const st have_exec_lock = false; if (fa) - posix_spawn_fa_free(fa); + posix_spawn_fa_free(fa, fa->len); if (sa) kmem_free(sa, sizeof(*sa)); @@ -2302,7 +2299,7 @@ sys_posix_spawn(struct lwp *l1, const st rw_exit(&exec_lock); if (fa) - posix_spawn_fa_free(fa); + posix_spawn_fa_free(fa, fa->len); if (sa) kmem_free(sa, sizeof(*sa));