From 0469a46a55e4c311e5c11db2a2cef68a72e619c2 Mon Sep 17 00:00:00 2001 From: Kirill Tkhai Date: Wed, 3 May 2017 15:48:14 +0300 Subject: [PATCH] seize: Fix size error in creds_dumpable() The goal of this function is to compare everything except caps, but caps size is took to compare. It's wrong, there must be used offsetof(struct proc_status_creds, cap_inh) instead. Also, sigpnd may be different too. v3: Move excluding sigpnd from comparation in this patch (was in another patch). Reorder fields in seize_task_status(). Signed-off-by: Kirill Tkhai Signed-off-by: Andrei Vagin --- compel/include/uapi/infect.h | 4 ++-- criu/seize.c | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/compel/include/uapi/infect.h b/compel/include/uapi/infect.h index 005d6bda6..0d79f1346 100644 --- a/compel/include/uapi/infect.h +++ b/compel/include/uapi/infect.h @@ -16,10 +16,10 @@ extern int compel_interrupt_task(int pid); struct seize_task_status { - char state; - int ppid; unsigned long long sigpnd; unsigned long long shdpnd; + char state; + int ppid; int seccomp_mode; }; diff --git a/criu/seize.c b/criu/seize.c index d5079ca6c..064b4a8ec 100644 --- a/criu/seize.c +++ b/criu/seize.c @@ -629,9 +629,7 @@ static inline bool thread_collected(struct pstree_item *i, pid_t tid) static bool creds_dumpable(struct proc_status_creds *parent, struct proc_status_creds *child) { - const size_t size = sizeof(struct proc_status_creds) - - offsetof(struct proc_status_creds, cap_inh); - + size_t size; /* * The comparison rules are the following * @@ -640,17 +638,20 @@ static bool creds_dumpable(struct proc_status_creds *parent, * semantic comparison (FIXME) but for * now we require them to be exactly * identical + * - sigpnd may be different * - the rest of members must match */ - if (memcmp(parent, child, size)) { + size = offsetof(struct proc_status_creds, cap_inh) - + sizeof(parent->s.sigpnd); + + if (memcmp(&parent->s.sigpnd, &child->s.sigpnd, size)) { if (!pr_quelled(LOG_DEBUG)) { pr_debug("Creds undumpable (parent:child)\n" " uids: %d:%d %d:%d %d:%d %d:%d\n" " gids: %d:%d %d:%d %d:%d %d:%d\n" " state: %d:%d" " ppid: %d:%d\n" - " sigpnd: %llu:%llu\n" " shdpnd: %llu:%llu\n" " seccomp_mode: %d:%d\n" " last_filter: %u:%u\n", @@ -664,7 +665,6 @@ static bool creds_dumpable(struct proc_status_creds *parent, parent->gids[3], child->gids[3], parent->s.state, child->s.state, parent->s.ppid, child->s.ppid, - parent->s.sigpnd, child->s.sigpnd, parent->s.shdpnd, child->s.shdpnd, parent->s.seccomp_mode, child->s.seccomp_mode, parent->last_filter, child->last_filter);