diff options
-rw-r--r-- | fs/binfmt_elf.c | 12 | ||||
-rw-r--r-- | include/linux/auxvec.h | 6 |
2 files changed, 15 insertions, 3 deletions
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index c41fa2af7677..e3ff2b9e602f 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c | |||
@@ -152,8 +152,10 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec, | |||
152 | elf_addr_t __user *sp; | 152 | elf_addr_t __user *sp; |
153 | elf_addr_t __user *u_platform; | 153 | elf_addr_t __user *u_platform; |
154 | elf_addr_t __user *u_base_platform; | 154 | elf_addr_t __user *u_base_platform; |
155 | elf_addr_t __user *u_rand_bytes; | ||
155 | const char *k_platform = ELF_PLATFORM; | 156 | const char *k_platform = ELF_PLATFORM; |
156 | const char *k_base_platform = ELF_BASE_PLATFORM; | 157 | const char *k_base_platform = ELF_BASE_PLATFORM; |
158 | unsigned char k_rand_bytes[16]; | ||
157 | int items; | 159 | int items; |
158 | elf_addr_t *elf_info; | 160 | elf_addr_t *elf_info; |
159 | int ei_index = 0; | 161 | int ei_index = 0; |
@@ -196,6 +198,15 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec, | |||
196 | return -EFAULT; | 198 | return -EFAULT; |
197 | } | 199 | } |
198 | 200 | ||
201 | /* | ||
202 | * Generate 16 random bytes for userspace PRNG seeding. | ||
203 | */ | ||
204 | get_random_bytes(k_rand_bytes, sizeof(k_rand_bytes)); | ||
205 | u_rand_bytes = (elf_addr_t __user *) | ||
206 | STACK_ALLOC(p, sizeof(k_rand_bytes)); | ||
207 | if (__copy_to_user(u_rand_bytes, k_rand_bytes, sizeof(k_rand_bytes))) | ||
208 | return -EFAULT; | ||
209 | |||
199 | /* Create the ELF interpreter info */ | 210 | /* Create the ELF interpreter info */ |
200 | elf_info = (elf_addr_t *)current->mm->saved_auxv; | 211 | elf_info = (elf_addr_t *)current->mm->saved_auxv; |
201 | /* update AT_VECTOR_SIZE_BASE if the number of NEW_AUX_ENT() changes */ | 212 | /* update AT_VECTOR_SIZE_BASE if the number of NEW_AUX_ENT() changes */ |
@@ -228,6 +239,7 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec, | |||
228 | NEW_AUX_ENT(AT_GID, cred->gid); | 239 | NEW_AUX_ENT(AT_GID, cred->gid); |
229 | NEW_AUX_ENT(AT_EGID, cred->egid); | 240 | NEW_AUX_ENT(AT_EGID, cred->egid); |
230 | NEW_AUX_ENT(AT_SECURE, security_bprm_secureexec(bprm)); | 241 | NEW_AUX_ENT(AT_SECURE, security_bprm_secureexec(bprm)); |
242 | NEW_AUX_ENT(AT_RANDOM, (elf_addr_t)(unsigned long)u_rand_bytes); | ||
231 | NEW_AUX_ENT(AT_EXECFN, bprm->exec); | 243 | NEW_AUX_ENT(AT_EXECFN, bprm->exec); |
232 | if (k_platform) { | 244 | if (k_platform) { |
233 | NEW_AUX_ENT(AT_PLATFORM, | 245 | NEW_AUX_ENT(AT_PLATFORM, |
diff --git a/include/linux/auxvec.h b/include/linux/auxvec.h index d7afa9dd6635..f3b5d4e3a2ac 100644 --- a/include/linux/auxvec.h +++ b/include/linux/auxvec.h | |||
@@ -23,16 +23,16 @@ | |||
23 | #define AT_PLATFORM 15 /* string identifying CPU for optimizations */ | 23 | #define AT_PLATFORM 15 /* string identifying CPU for optimizations */ |
24 | #define AT_HWCAP 16 /* arch dependent hints at CPU capabilities */ | 24 | #define AT_HWCAP 16 /* arch dependent hints at CPU capabilities */ |
25 | #define AT_CLKTCK 17 /* frequency at which times() increments */ | 25 | #define AT_CLKTCK 17 /* frequency at which times() increments */ |
26 | 26 | /* AT_* values 18 through 22 are reserved */ | |
27 | #define AT_SECURE 23 /* secure mode boolean */ | 27 | #define AT_SECURE 23 /* secure mode boolean */ |
28 | |||
29 | #define AT_BASE_PLATFORM 24 /* string identifying real platform, may | 28 | #define AT_BASE_PLATFORM 24 /* string identifying real platform, may |
30 | * differ from AT_PLATFORM. */ | 29 | * differ from AT_PLATFORM. */ |
30 | #define AT_RANDOM 25 /* address of 16 random bytes */ | ||
31 | 31 | ||
32 | #define AT_EXECFN 31 /* filename of program */ | 32 | #define AT_EXECFN 31 /* filename of program */ |
33 | 33 | ||
34 | #ifdef __KERNEL__ | 34 | #ifdef __KERNEL__ |
35 | #define AT_VECTOR_SIZE_BASE 18 /* NEW_AUX_ENT entries in auxiliary table */ | 35 | #define AT_VECTOR_SIZE_BASE 19 /* NEW_AUX_ENT entries in auxiliary table */ |
36 | /* number of "#define AT_.*" above, minus {AT_NULL, AT_IGNORE, AT_NOTELF} */ | 36 | /* number of "#define AT_.*" above, minus {AT_NULL, AT_IGNORE, AT_NOTELF} */ |
37 | #endif | 37 | #endif |
38 | 38 | ||