diff options
author | kib <kib@FreeBSD.org> | 2014-10-28 15:28:20 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2014-10-28 15:28:20 +0000 |
commit | ad7bf17db75d7ea3f4dfe0208a89f5bd1525ccbb (patch) | |
tree | 55b8b2977c2be396e61f51cb119f65f88d3c2d27 /sys/kern/kern_exec.c | |
parent | 29a659ef8ed79922c50d1882b3cb348338f05a09 (diff) | |
download | FreeBSD-src-ad7bf17db75d7ea3f4dfe0208a89f5bd1525ccbb.zip FreeBSD-src-ad7bf17db75d7ea3f4dfe0208a89f5bd1525ccbb.tar.gz |
Replace some calls to fuword() by fueword() with proper error checking.
Sponsored by: The FreeBSD Foundation
Tested by: pho
MFC after: 3 weeks
Diffstat (limited to 'sys/kern/kern_exec.c')
-rw-r--r-- | sys/kern/kern_exec.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c index 09212c8..45d4c6f 100644 --- a/sys/kern/kern_exec.c +++ b/sys/kern/kern_exec.c @@ -1091,7 +1091,7 @@ int exec_copyin_args(struct image_args *args, char *fname, enum uio_seg segflg, char **argv, char **envv) { - char *argp, *envp; + u_long argp, envp; int error; size_t length; @@ -1127,13 +1127,17 @@ exec_copyin_args(struct image_args *args, char *fname, /* * extract arguments first */ - while ((argp = (caddr_t) (intptr_t) fuword(argv++))) { - if (argp == (caddr_t) -1) { + for (;;) { + error = fueword(argv++, &argp); + if (error == -1) { error = EFAULT; goto err_exit; } - if ((error = copyinstr(argp, args->endp, - args->stringspace, &length))) { + if (argp == 0) + break; + error = copyinstr((void *)(uintptr_t)argp, args->endp, + args->stringspace, &length); + if (error != 0) { if (error == ENAMETOOLONG) error = E2BIG; goto err_exit; @@ -1149,13 +1153,17 @@ exec_copyin_args(struct image_args *args, char *fname, * extract environment strings */ if (envv) { - while ((envp = (caddr_t)(intptr_t)fuword(envv++))) { - if (envp == (caddr_t)-1) { + for (;;) { + error = fueword(envv++, &envp); + if (error == -1) { error = EFAULT; goto err_exit; } - if ((error = copyinstr(envp, args->endp, - args->stringspace, &length))) { + if (envp == 0) + break; + error = copyinstr((void *)(uintptr_t)envp, + args->endp, args->stringspace, &length); + if (error != 0) { if (error == ENAMETOOLONG) error = E2BIG; goto err_exit; |