linux-user: fake /proc/self/auxv
Gtk tries to read /proc/self/auxv to find its auxv table instead of taking it from its own program memory space. However, when running with linux-user, we see the host's auxv which clearly exposes wrong information. so let's instead expose the guest memory backed auxv tables via /proc/self/auxv as well. Signed-off-by: Alexander Graf <agraf@suse.de> Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
This commit is contained in:
parent
480b8e7dd5
commit
257450ee59
@ -4639,6 +4639,35 @@ static int open_self_stat(void *cpu_env, int fd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int open_self_auxv(void *cpu_env, int fd)
|
||||
{
|
||||
TaskState *ts = ((CPUState *)cpu_env)->opaque;
|
||||
abi_ulong auxv = ts->info->saved_auxv;
|
||||
abi_ulong len = ts->info->auxv_len;
|
||||
char *ptr;
|
||||
|
||||
/*
|
||||
* Auxiliary vector is stored in target process stack.
|
||||
* read in whole auxv vector and copy it to file
|
||||
*/
|
||||
ptr = lock_user(VERIFY_READ, auxv, len, 0);
|
||||
if (ptr != NULL) {
|
||||
while (len > 0) {
|
||||
ssize_t r;
|
||||
r = write(fd, ptr, len);
|
||||
if (r <= 0) {
|
||||
break;
|
||||
}
|
||||
len -= r;
|
||||
ptr += r;
|
||||
}
|
||||
lseek(fd, 0, SEEK_SET);
|
||||
unlock_user(ptr, auxv, len);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int do_open(void *cpu_env, const char *pathname, int flags, mode_t mode)
|
||||
{
|
||||
struct fake_open {
|
||||
@ -4649,6 +4678,7 @@ static int do_open(void *cpu_env, const char *pathname, int flags, mode_t mode)
|
||||
static const struct fake_open fakes[] = {
|
||||
{ "/proc/self/maps", open_self_maps },
|
||||
{ "/proc/self/stat", open_self_stat },
|
||||
{ "/proc/self/auxv", open_self_auxv },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user