From 89acf5c5d60e76a3d0f325dcfae0f9e4731b2141 Mon Sep 17 00:00:00 2001 From: Balazs Gerofi Date: Mon, 10 Nov 2014 18:30:27 +0900 Subject: [PATCH] support for AT_RANDOM auxiliary entry on the process stack (needed for _dl_random in glibc) --- kernel/include/process.h | 2 +- kernel/process.c | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/kernel/include/process.h b/kernel/include/process.h index ad61bbd4..65b06c6b 100644 --- a/kernel/include/process.h +++ b/kernel/include/process.h @@ -212,7 +212,7 @@ struct user unsigned long int u_debugreg [8]; }; -#define AUXV_LEN 14 +#define AUXV_LEN 16 struct vm_range { struct list_head list; diff --git a/kernel/process.c b/kernel/process.c index ec6f0086..84771dc2 100644 --- a/kernel/process.c +++ b/kernel/process.c @@ -1445,6 +1445,7 @@ int init_process_stack(struct process *process, struct program_load_desc *pn, int error; unsigned long *p; unsigned long minsz; + unsigned long at_rand; /* create stack range */ minsz = PAGE_SIZE; @@ -1487,6 +1488,12 @@ int init_process_stack(struct process *process, struct program_load_desc *pn, /* set up initial stack frame */ p = (unsigned long *)(stack + minsz); s_ind = -1; + + /* "random" 16 bytes on the very top */ + p[s_ind--] = 0x010101011; + p[s_ind--] = 0x010101011; + at_rand = end + sizeof(unsigned long) * s_ind; + /* auxiliary vector */ /* If you add/delete entires, please increase/decrease AUXV_LEN in include/process.h. */ @@ -1504,10 +1511,14 @@ int init_process_stack(struct process *process, struct program_load_desc *pn, p[s_ind--] = AT_PAGESZ; p[s_ind--] = pn->at_clktck; /* AT_CLKTCK */ p[s_ind--] = AT_CLKTCK; + p[s_ind--] = at_rand; /* AT_RANDOM */ + p[s_ind--] = AT_RANDOM; + /* Save auxiliary vector for later use. */ memcpy(process->saved_auxv, &p[s_ind + 1], sizeof(process->saved_auxv)); - p[s_ind--] = 0; /* envp terminating NULL */ + + p[s_ind--] = 0; /* envp terminating NULL */ /* envp */ for (arg_ind = envc - 1; arg_ind > -1; --arg_ind) { p[s_ind--] = (unsigned long)env[arg_ind];