diff options
Diffstat (limited to 'fs/binfmt_elf.c')
| -rw-r--r-- | fs/binfmt_elf.c | 12 |
1 files changed, 12 insertions, 0 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, |
