[CRIU] [PATCHv2 11/22] vdso: separate vdso_parse_maps() from vdso_fill_self_symtable()
Dmitry Safonov
dsafonov at virtuozzo.com
Wed Dec 7 09:56:26 PST 2016
We need to know compatible vdso/vvar sizes, so add pid argument
to parse another process - it's needed to fork(), remap vdso
and parse child's vdso/vvar in CRIU.
Signed-off-by: Dmitry Safonov <dsafonov at virtuozzo.com>
---
criu/vdso.c | 37 ++++++++++++++++++++++---------------
1 file changed, 22 insertions(+), 15 deletions(-)
diff --git a/criu/vdso.c b/criu/vdso.c
index dbbf84e09714..47f0ff498adc 100644
--- a/criu/vdso.c
+++ b/criu/vdso.c
@@ -222,15 +222,15 @@ err:
return exit_code;
}
-static int vdso_fill_self_symtable(struct vdso_symtable *s)
+static int vdso_parse_maps(pid_t pid, struct vdso_symtable *s)
{
+ int exit_code = -1;
char buf[512];
- int ret, exit_code = -1;
FILE *maps;
*s = (struct vdso_symtable)VDSO_SYMTABLE_INIT;
- maps = fopen_proc(PROC_SELF, "maps");
+ maps = fopen_proc(pid, "maps");
if (!maps)
return -1;
@@ -247,8 +247,7 @@ static int vdso_fill_self_symtable(struct vdso_symtable *s)
if (!has_vdso && !has_vvar)
continue;
- ret = sscanf(buf, "%lx-%lx", &start, &end);
- if (ret != 2) {
+ if (sscanf(buf, "%lx-%lx", &start, &end) != 2) {
pr_err("Can't find vDSO/VVAR bounds\n");
goto err;
}
@@ -260,10 +259,6 @@ static int vdso_fill_self_symtable(struct vdso_symtable *s)
}
s->vma_start = start;
s->vma_end = end;
-
- ret = vdso_fill_symtable(start, end - start, s);
- if (ret)
- goto err;
} else {
if (s->vvar_start != VVAR_BAD_ADDR) {
pr_err("Got second VVAR entry\n");
@@ -274,6 +269,21 @@ static int vdso_fill_self_symtable(struct vdso_symtable *s)
}
}
+ exit_code = 0;
+err:
+ fclose(maps);
+ return exit_code;
+}
+
+static int vdso_fill_self_symtable(struct vdso_symtable *s)
+{
+
+ if (vdso_parse_maps(PROC_SELF, s))
+ return -1;
+
+ if (vdso_fill_symtable(s->vma_start, s->vma_end - s->vma_start, s))
+ return -1;
+
/*
* Validate its structure -- for new vDSO format the
* structure must be like
@@ -292,22 +302,19 @@ static int vdso_fill_self_symtable(struct vdso_symtable *s)
if (s->vma_end != s->vvar_start &&
s->vvar_end != s->vma_start) {
pr_err("Unexpected rt vDSO area bounds\n");
- goto err;
+ return -1;
}
}
} else {
pr_err("Can't find rt vDSO\n");
- goto err;
+ return -1;
}
pr_debug("rt [vdso] %lx-%lx [vvar] %lx-%lx\n",
s->vma_start, s->vma_end,
s->vvar_start, s->vvar_end);
- exit_code = 0;
-err:
- fclose(maps);
- return exit_code;
+ return 0;
}
int vdso_init(void)
--
2.10.2
More information about the CRIU
mailing list