Commit 1c4f8478 authored by Cyrill Gorcunov's avatar Cyrill Gorcunov Committed by Pavel Emelyanov

vdso: x86 -- Make sure the mark version matches

Otherwise we're meeting somehow corrupted mark and
must abort dumping.
Reported-by: 's avatarPavel Emelyanov <xemul@parallels.com>
Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
Acked-by: 's avatarAndrew Vagin <avagin@parallels.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent fe7b8aeb
...@@ -103,6 +103,7 @@ struct vdso_mark { ...@@ -103,6 +103,7 @@ struct vdso_mark {
#define VDSO_MARK_SIGNATURE (0x6f73647675697263ULL) /* Magic number (criuvdso) */ #define VDSO_MARK_SIGNATURE (0x6f73647675697263ULL) /* Magic number (criuvdso) */
#define VDSO_MARK_SIGNATURE_V2 (0x4f53447675697263ULL) /* Magic number (criuvDSO) */ #define VDSO_MARK_SIGNATURE_V2 (0x4f53447675697263ULL) /* Magic number (criuvDSO) */
#define VDSO_MARK_CUR_VERSION (2)
static inline void vdso_put_mark(void *where, unsigned long proxy_vdso_addr, unsigned long proxy_vvar_addr) static inline void vdso_put_mark(void *where, unsigned long proxy_vdso_addr, unsigned long proxy_vvar_addr)
{ {
...@@ -110,7 +111,7 @@ static inline void vdso_put_mark(void *where, unsigned long proxy_vdso_addr, uns ...@@ -110,7 +111,7 @@ static inline void vdso_put_mark(void *where, unsigned long proxy_vdso_addr, uns
m->signature = VDSO_MARK_SIGNATURE_V2; m->signature = VDSO_MARK_SIGNATURE_V2;
m->proxy_vdso_addr = proxy_vdso_addr; m->proxy_vdso_addr = proxy_vdso_addr;
m->version = 2; m->version = VDSO_MARK_CUR_VERSION;
m->proxy_vvar_addr = proxy_vvar_addr; m->proxy_vvar_addr = proxy_vvar_addr;
} }
...@@ -122,7 +123,7 @@ static inline bool is_vdso_mark(void *addr) ...@@ -122,7 +123,7 @@ static inline bool is_vdso_mark(void *addr)
/* /*
* New format * New format
*/ */
return m->version == 2; return true;
} else if (m->signature == VDSO_MARK_SIGNATURE) { } else if (m->signature == VDSO_MARK_SIGNATURE) {
/* /*
* Old format -- simply extend the mark up * Old format -- simply extend the mark up
......
...@@ -331,6 +331,14 @@ static int parasite_check_vdso_mark(struct parasite_vdso_vma_entry *args) ...@@ -331,6 +331,14 @@ static int parasite_check_vdso_mark(struct parasite_vdso_vma_entry *args)
struct vdso_mark *m = (void *)args->start; struct vdso_mark *m = (void *)args->start;
if (is_vdso_mark(m)) { if (is_vdso_mark(m)) {
/*
* Make sure we don't meet some corrupted entry
* where signature matches but verions is not!
*/
if (m->version != VDSO_MARK_CUR_VERSION) {
pr_err("vdso: Mark version mismatch!\n");
return -EINVAL;
}
args->is_marked = 1; args->is_marked = 1;
args->proxy_vdso_addr = m->proxy_vdso_addr; args->proxy_vdso_addr = m->proxy_vdso_addr;
args->proxy_vvar_addr = m->proxy_vvar_addr; args->proxy_vvar_addr = m->proxy_vvar_addr;
......
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