ring 0 Linux


         

elf_core_dump(),


! len (. /* 1 */) copy_form_user, . (. /* 2 */). ? ! current->
mm->
arg_start , current->
mm->
arg_end, .

? , current->
mm->
arg_start current->
mm->
arg_end create_elf_tables, strnlen_user , current->
mm->
arg_start, current->
mm->
arg_end , .

static elf_addr_t *

create_elf_tables(char *p, int argc, int envc,

struct elfhdr * exec,

unsigned long load_addr,

unsigned long load_bias,

unsigned long interp_load_addr, int ibcs)

{

current->
mm->
arg_start = (unsigned long) p;

while (argc-->
0)

{

__put_user((elf_caddr_t)(unsigned long)p,argv++);

len = strnlen_user(p, PAGE_SIZE*MAX_ARG_PAGES);

if (!len || len >
PAGE_SIZE*MAX_ARG_PAGES)

return NULL; /* * */

p += len;

}

__put_user(NULL, argv);

current->
mm->
arg_end = current->
mm->
env_start = (unsigned long) p;

}