Module Name: src Committed By: uebayasi Date: Fri Apr 18 06:59:32 UTC 2014
Modified Files: src/sys/kern: kern_exec.c Log Message: calcargs: Correct the size of "argc" in the stack size calculation. (The old code has worked because it is compensated by wrong size calculation of "auxinfo" (multiplied by sizeof(void *)).) To generate a diff of this commit: cvs rdiff -u -r1.401 -r1.402 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.401 src/sys/kern/kern_exec.c:1.402 --- src/sys/kern/kern_exec.c:1.401 Wed Apr 16 02:22:38 2014 +++ src/sys/kern/kern_exec.c Fri Apr 18 06:59:32 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_exec.c,v 1.401 2014/04/16 02:22:38 uebayasi Exp $ */ +/* $NetBSD: kern_exec.c,v 1.402 2014/04/18 06:59:32 uebayasi 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.401 2014/04/16 02:22:38 uebayasi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_exec.c,v 1.402 2014/04/18 06:59:32 uebayasi Exp $"); #include "opt_exec.h" #include "opt_execfmt.h" @@ -1331,6 +1331,7 @@ calcargs(struct execve_data * restrict d struct exec_package * const epp = &data->ed_pack; const size_t nargenvptrs = + 1 + /* long argc */ data->ed_argc + /* char *argv[] */ 1 + /* \0 */ data->ed_envc + /* char *env[] */ @@ -1340,11 +1341,7 @@ calcargs(struct execve_data * restrict d const size_t ptrsz = (epp->ep_flags & EXEC_32) ? sizeof(int) : sizeof(char *); - const size_t argenvlen = - sizeof(int) + /* XXX argc in stack is long, not int */ - (nargenvptrs * ptrsz); /* XXX auxinfo multiplied by ptr size? */ - - return argenvlen + argenvstrlen; + return (nargenvptrs * ptrsz) + argenvstrlen; } static size_t @@ -1584,10 +1581,10 @@ copyargs(struct lwp *l, struct exec_pack CTASSERT(sizeof(*cpp) == sizeof(argc)); dp = (char *)(cpp + - 1 + /* argc */ - argc + /* *argv[] */ + 1 + /* long argc */ + argc + /* char *argv[] */ 1 + /* \0 */ - envc + /* *env[] */ + envc + /* char *env[] */ 1 + /* \0 */ /* XXX auxinfo multiplied by ptr size? */ pack->ep_esch->es_arglen); /* auxinfo */