|
20 | 20 | #define LINUX_AT_EGID 14 |
21 | 21 | #define LINUX_AT_PLATFORM 15 |
22 | 22 | #define LINUX_AT_HWCAP 16 |
| 23 | +#define LINUX_AT_HWCAP2 26 |
23 | 24 | #define LINUX_AT_CLKTCK 17 |
24 | 25 | #define LINUX_AT_SECURE 23 |
25 | 26 | #define LINUX_AT_RANDOM 25 |
26 | 27 | #define LINUX_AT_EXECFN 31 |
27 | 28 | #define IA32_FS_BASE_MSR 0xC0000100 |
| 29 | +#define USER_AUXV_MAX 18 |
28 | 30 |
|
29 | 31 | typedef struct { |
30 | 32 | int i[4]; |
@@ -159,7 +161,7 @@ static uint64_t build_initial_user_stack(const char* exec_path, |
159 | 161 | uint64_t env_addrs[32]; |
160 | 162 | char random_bytes[16]; |
161 | 163 | char exec_name_buf[256]; |
162 | | - auxv_pair_t auxv[16]; |
| 164 | + auxv_pair_t auxv[USER_AUXV_MAX]; |
163 | 165 | uint64_t frame_words = 0; |
164 | 166 | uint64_t frame_top = 0; |
165 | 167 | uint64_t frame_ptr = 0; |
@@ -202,8 +204,9 @@ static uint64_t build_initial_user_stack(const char* exec_path, |
202 | 204 | auxv[auxc++] = (auxv_pair_t){ LINUX_AT_CLKTCK, 100 }; |
203 | 205 | auxv[auxc++] = (auxv_pair_t){ LINUX_AT_SECURE, 0 }; |
204 | 206 | auxv[auxc++] = (auxv_pair_t){ LINUX_AT_RANDOM, random_addr }; |
| 207 | + auxv[auxc++] = (auxv_pair_t){ LINUX_AT_HWCAP2, 0 }; |
205 | 208 | auxv[auxc++] = (auxv_pair_t){ LINUX_AT_PLATFORM, platform_addr }; |
206 | | - if (execfn_addr) |
| 209 | + if (execfn_addr && auxc < USER_AUXV_MAX) |
207 | 210 | auxv[auxc++] = (auxv_pair_t){ LINUX_AT_EXECFN, execfn_addr }; |
208 | 211 |
|
209 | 212 | frame_words = 1 + (uint64_t)argc + 1 + (uint64_t)envc + 1 + ((uint64_t)(auxc + 1) * 2); |
|
0 commit comments