Commit 928fe9be authored by Dmitry Safonov's avatar Dmitry Safonov Committed by Andrei Vagin

restorer: refill symtable for rt-vdso

Otherwise, we still have parsed x86_64 vdso symtable.
After this:
  pie: 17917: vdso: Mapping compatible vDSO at 0x25000
  pie: 17917: vdso: Parsing at 0x25000 0x29000
  pie: 17917: Error (pie/util-vdso-elf32.c:87): vdso: Elf header magic m>
  pie: 17917: ismatch
  pie: 17917: vdso: Parsing at 0x26000 0x29000
  pie: 17917: Error (pie/util-vdso-elf32.c:87): vdso: Elf header magic m>
  pie: 17917: ismatch
  pie: 17917: vdso: Parsing at 0x27000 0x29000
  pie: 17917: vdso: PT_LOAD p_vaddr: 0x0
  pie: 17917: vdso: DT_HASH: 0xb4
  pie: 17917: vdso: DT_STRTAB: 0x1c0
  pie: 17917: vdso: DT_SYMTAB: 0x130
  pie: 17917: vdso: DT_STRSZ: 0x95
  pie: 17917: vdso: DT_SYMENT: 0x10
  pie: 17917: vdso: nbucket 0x3 nchain 0x9 bucket 0x270bc chain 0x270c8

Cc: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: 's avatarDmitry Safonov <dsafonov@virtuozzo.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent f52ea57d
...@@ -80,14 +80,15 @@ static inline bool is_vdso_mark(void *addr) ...@@ -80,14 +80,15 @@ static inline bool is_vdso_mark(void *addr)
} }
extern int vdso_do_park(struct vdso_symtable *sym_rt, unsigned long park_at, unsigned long park_size); extern int vdso_do_park(struct vdso_symtable *sym_rt, unsigned long park_at, unsigned long park_size);
int vdso_map_compat(unsigned long map_at); extern int vdso_map_compat(unsigned long map_at, unsigned long park_size,
struct vdso_symtable *sym_rt);
extern int vdso_proxify(char *who, struct vdso_symtable *sym_rt, extern int vdso_proxify(char *who, struct vdso_symtable *sym_rt,
unsigned long vdso_rt_parked_at, size_t index, unsigned long vdso_rt_parked_at, size_t index,
VmaEntry *vmas, size_t nr_vmas, bool compat_vdso); VmaEntry *vmas, size_t nr_vmas, bool compat_vdso);
#else /* CONFIG_VDSO */ #else /* CONFIG_VDSO */
#define vdso_do_park(sym_rt, park_at, park_size) (0) #define vdso_do_park(sym_rt, park_at, park_size) (0)
#define vdso_map_compat(map_at) (0) #define vdso_map_compat(map_at, park_size, sym_rt) (0)
#endif /* CONFIG_VDSO */ #endif /* CONFIG_VDSO */
......
...@@ -72,18 +72,37 @@ int vdso_do_park(struct vdso_symtable *sym_rt, unsigned long park_at, unsigned l ...@@ -72,18 +72,37 @@ int vdso_do_park(struct vdso_symtable *sym_rt, unsigned long park_at, unsigned l
#ifndef ARCH_MAP_VDSO_32 #ifndef ARCH_MAP_VDSO_32
# define ARCH_MAP_VDSO_32 0x2002 # define ARCH_MAP_VDSO_32 0x2002
#endif #endif
int vdso_map_compat(unsigned long map_at) extern int vdso_fill_symtable_compat(uintptr_t mem, size_t size,
struct vdso_symtable *t);
int vdso_map_compat(unsigned long map_at, unsigned long park_size,
struct vdso_symtable *sym_rt)
{ {
unsigned long search_vdso;
int ret; int ret;
pr_debug("Mapping compatible vDSO at %lx\n", map_at); pr_debug("Mapping compatible vDSO at %lx\n", map_at);
ret = sys_arch_prctl(ARCH_MAP_VDSO_32, map_at); ret = sys_arch_prctl(ARCH_MAP_VDSO_32, map_at);
if (ret)
return ret;
/*
* We could map VVAR firstly, or VDSO.
* Try to find VDSO pages in this couple of parking pages.
*/
for (search_vdso = map_at; search_vdso < map_at + park_size;
search_vdso += PAGE_SIZE)
{
ret = vdso_fill_symtable_compat(search_vdso,
map_at + park_size - search_vdso, sym_rt);
if (!ret)
return 0;
}
pr_err("Failed to parse a arch_prctl-mapped vDSO %d\n", ret);
return ret; return ret;
} }
extern int vdso_fill_symtable_compat(uintptr_t mem, size_t size,
struct vdso_symtable *t);
int __vdso_fill_symtable(uintptr_t mem, size_t size, int __vdso_fill_symtable(uintptr_t mem, size_t size,
struct vdso_symtable *t, bool compat_vdso) struct vdso_symtable *t, bool compat_vdso)
{ {
...@@ -93,7 +112,9 @@ int __vdso_fill_symtable(uintptr_t mem, size_t size, ...@@ -93,7 +112,9 @@ int __vdso_fill_symtable(uintptr_t mem, size_t size,
return vdso_fill_symtable(mem, size, t); return vdso_fill_symtable(mem, size, t);
} }
#else #else
int vdso_map_compat(unsigned long map_at) int vdso_map_compat(unsigned long __always_unused map_at,
unsigned long __always_unused park_size,
struct vdso_symtable __always_unused *sym_rt)
{ {
return 0; return 0;
} }
......
...@@ -1100,7 +1100,8 @@ long __export_restore_task(struct task_restore_args *args) ...@@ -1100,7 +1100,8 @@ long __export_restore_task(struct task_restore_args *args)
if (args->compatible_mode) { if (args->compatible_mode) {
/* Map compatible vdso */ /* Map compatible vdso */
if (vdso_map_compat(args->vdso_rt_parked_at)) if (vdso_map_compat(args->vdso_rt_parked_at,
vdso_rt_size, &args->vdso_sym_rt))
goto core_restore_end; goto core_restore_end;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment