From fab064181309c8f23556667ddbfb0970a525b632 Mon Sep 17 00:00:00 2001 From: Balazs Gerofi Date: Mon, 19 Mar 2018 13:56:04 +0900 Subject: [PATCH] prepare_process_ranges_args_envs(): fix generating saved_cmdline to avoid PF in strlen() --- kernel/host.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/kernel/host.c b/kernel/host.c index 5a7879e3..4c0aa0b2 100644 --- a/kernel/host.c +++ b/kernel/host.c @@ -79,7 +79,7 @@ int prepare_process_ranges_args_envs(struct thread *thread, unsigned long s, e, up; char **argv; char **a; - int i, n, argc, envc, args_envs_npages, l; + int i, n, argc, envc, args_envs_npages; char **env; int range_npages; void *up_v; @@ -349,21 +349,25 @@ int prepare_process_ranges_args_envs(struct thread *thread, // Update variables argc = *((long *)(args_envs)); dkprintf("argc: %d\n", argc); - argv = (char **)(args_envs + (sizeof(long))); - if(proc->saved_cmdline){ + + if (proc->saved_cmdline) { kfree(proc->saved_cmdline); + proc->saved_cmdline = NULL; proc->saved_cmdline_len = 0; } - for(a = argv, l = 0; *a; a++) - l += strlen(args_envs + (unsigned long)*a) + 1; + proc->saved_cmdline = kmalloc(p->args_len, IHK_MC_AP_NOWAIT); - if(!proc->saved_cmdline) + if (!proc->saved_cmdline) { goto err; - proc->saved_cmdline_len = l; - for(a = argv, l = 0; *a; a++){ - strcpy(proc->saved_cmdline + l, args_envs + (unsigned long)*a); - l += strlen(args_envs + (unsigned long)*a) + 1; + } + + proc->saved_cmdline_len = p->args_len - ((argc + 1) * sizeof(char **)); + memcpy(proc->saved_cmdline, + (char *)args_envs + ((argc + 1) * sizeof(char **)), + proc->saved_cmdline_len); + + for (a = argv; *a; a++) { *a = (char *)addr + (unsigned long)*a; // Process' address space! }