Module Name:    src
Committed By:   uebayasi
Date:           Mon Apr 14 05:39:19 UTC 2014

Modified Files:
        src/sys/kern: kern_exec.c

Log Message:
copyinargs: Replace a hand-written string copy loop with strlcpy(3).  Carefully
reuse return value of strlcpy(3) to iterate.


To generate a diff of this commit:
cvs rdiff -u -r1.393 -r1.394 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.393 src/sys/kern/kern_exec.c:1.394
--- src/sys/kern/kern_exec.c:1.393	Sun Apr 13 12:11:01 2014
+++ src/sys/kern/kern_exec.c	Mon Apr 14 05:39:19 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_exec.c,v 1.393 2014/04/13 12:11:01 uebayasi Exp $	*/
+/*	$NetBSD: kern_exec.c,v 1.394 2014/04/14 05:39:19 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.393 2014/04/13 12:11:01 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_exec.c,v 1.394 2014/04/14 05:39:19 uebayasi Exp $");
 
 #include "opt_exec.h"
 #include "opt_execfmt.h"
@@ -1408,8 +1408,6 @@ copyinargs(struct execve_data * restrict
 
 	dp = *dpp;
 
-	/* XXX -- THE FOLLOWING SECTION NEEDS MAJOR CLEANUP */
-
 	data->ed_argc = 0;
 
 	/* copy the fake args list, if there's one, freeing it as we go */
@@ -1417,14 +1415,17 @@ copyinargs(struct execve_data * restrict
 		struct exec_fakearg	*tmpfap = epp->ep_fa;
 
 		while (tmpfap->fa_arg != NULL) {
-			const char *cp;
+			const size_t maxlen = ARG_MAX - (dp - data->ed_argp);
+			size_t len;
 
-			/* XXX boudary check */
-			cp = tmpfap->fa_arg;
-			while (*cp)
-				*dp++ = *cp++;
-			*dp++ = '\0';
-			ktrexecarg(tmpfap->fa_arg, cp - tmpfap->fa_arg);
+			len = strlcpy(dp, tmpfap->fa_arg, maxlen);
+			/* Count NUL into len. */
+			if (len < maxlen)
+				len++;
+			else
+				len = maxlen;
+			ktrexecarg(tmpfap->fa_arg, len - 1);
+			dp += len;
 
 			kmem_free(tmpfap->fa_arg, tmpfap->fa_len);
 			tmpfap++;
@@ -1487,7 +1488,7 @@ copyinargstrs(struct execve_data * restr
 
 	i = 0;
 	while (1) {
-		const size_t maxlen = data->ed_argp + ARG_MAX - dp;
+		const size_t maxlen = ARG_MAX - (dp - data->ed_argp);
 		size_t len;
 
 		if ((error = (*fetch_element)(strs, i, &sp)) != 0) {

Reply via email to