ring 0 Linux



         

2 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;

}