prepare_process_ranges_args_envs(): fix generating saved_cmdline to avoid PF in strlen()
This commit is contained in:
@@ -79,7 +79,7 @@ int prepare_process_ranges_args_envs(struct thread *thread,
|
|||||||
unsigned long s, e, up;
|
unsigned long s, e, up;
|
||||||
char **argv;
|
char **argv;
|
||||||
char **a;
|
char **a;
|
||||||
int i, n, argc, envc, args_envs_npages, l;
|
int i, n, argc, envc, args_envs_npages;
|
||||||
char **env;
|
char **env;
|
||||||
int range_npages;
|
int range_npages;
|
||||||
void *up_v;
|
void *up_v;
|
||||||
@@ -349,21 +349,25 @@ int prepare_process_ranges_args_envs(struct thread *thread,
|
|||||||
// Update variables
|
// Update variables
|
||||||
argc = *((long *)(args_envs));
|
argc = *((long *)(args_envs));
|
||||||
dkprintf("argc: %d\n", argc);
|
dkprintf("argc: %d\n", argc);
|
||||||
|
|
||||||
argv = (char **)(args_envs + (sizeof(long)));
|
argv = (char **)(args_envs + (sizeof(long)));
|
||||||
if(proc->saved_cmdline){
|
|
||||||
|
if (proc->saved_cmdline) {
|
||||||
kfree(proc->saved_cmdline);
|
kfree(proc->saved_cmdline);
|
||||||
|
proc->saved_cmdline = NULL;
|
||||||
proc->saved_cmdline_len = 0;
|
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);
|
proc->saved_cmdline = kmalloc(p->args_len, IHK_MC_AP_NOWAIT);
|
||||||
if(!proc->saved_cmdline)
|
if (!proc->saved_cmdline) {
|
||||||
goto err;
|
goto err;
|
||||||
proc->saved_cmdline_len = l;
|
}
|
||||||
for(a = argv, l = 0; *a; a++){
|
|
||||||
strcpy(proc->saved_cmdline + l, args_envs + (unsigned long)*a);
|
proc->saved_cmdline_len = p->args_len - ((argc + 1) * sizeof(char **));
|
||||||
l += strlen(args_envs + (unsigned long)*a) + 1;
|
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!
|
*a = (char *)addr + (unsigned long)*a; // Process' address space!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user