Commit ffd40996 authored by Pavel Emelyanov's avatar Pavel Emelyanov

pb: Switch creds to protobuf format

Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent afea21f9
...@@ -50,6 +50,7 @@ ...@@ -50,6 +50,7 @@
#include "protobuf/fdinfo.pb-c.h" #include "protobuf/fdinfo.pb-c.h"
#include "protobuf/fs.pb-c.h" #include "protobuf/fs.pb-c.h"
#include "protobuf/mm.pb-c.h" #include "protobuf/mm.pb-c.h"
#include "protobuf/creds.pb-c.h"
#ifndef CONFIG_X86_64 #ifndef CONFIG_X86_64
# error No x86-32 support yet # error No x86-32 support yet
...@@ -452,9 +453,9 @@ err: ...@@ -452,9 +453,9 @@ err:
static int dump_task_creds(pid_t pid, const struct parasite_dump_misc *misc, static int dump_task_creds(pid_t pid, const struct parasite_dump_misc *misc,
const struct cr_fdset *fds) const struct cr_fdset *fds)
{ {
int ret, i; int ret;
struct proc_status_creds cr; struct proc_status_creds cr;
struct creds_entry ce; CredsEntry ce = CREDS_ENTRY__INIT;
pr_info("\n"); pr_info("\n");
pr_info("Dumping creds for %d)\n", pid); pr_info("Dumping creds for %d)\n", pid);
...@@ -475,20 +476,18 @@ static int dump_task_creds(pid_t pid, const struct parasite_dump_misc *misc, ...@@ -475,20 +476,18 @@ static int dump_task_creds(pid_t pid, const struct parasite_dump_misc *misc,
BUILD_BUG_ON(CR_CAP_SIZE != PROC_CAP_SIZE); BUILD_BUG_ON(CR_CAP_SIZE != PROC_CAP_SIZE);
for (i = 0; i < CR_CAP_SIZE; i++) { ce.n_cap_inh = CR_CAP_SIZE;
ce.cap_inh[i] = cr.cap_inh[i]; ce.cap_inh = cr.cap_inh;
ce.cap_prm[i] = cr.cap_prm[i]; ce.n_cap_prm = CR_CAP_SIZE;
ce.cap_eff[i] = cr.cap_eff[i]; ce.cap_prm = cr.cap_prm;
ce.cap_bnd[i] = cr.cap_bnd[i]; ce.n_cap_eff = CR_CAP_SIZE;
} ce.cap_eff = cr.cap_eff;
ce.n_cap_bnd = CR_CAP_SIZE;
ce.cap_bnd = cr.cap_bnd;
ce.secbits = misc->secbits; ce.secbits = misc->secbits;
ret = write_img(fdset_fd(fds, CR_FD_CREDS), &ce); return pb_write(fdset_fd(fds, CR_FD_CREDS), &ce, creds_entry);
if (ret < 0)
return ret;
return 0;
} }
#define assign_reg(dst, src, e) dst.e = (__typeof__(dst.e))src.e #define assign_reg(dst, src, e) dst.e = (__typeof__(dst.e))src.e
......
...@@ -1015,21 +1015,44 @@ out: ...@@ -1015,21 +1015,44 @@ out:
return ret; return ret;
} }
static inline int verify_cap_size(CredsEntry *ce)
{
return ((ce->n_cap_inh == CR_CAP_SIZE) && (ce->n_cap_eff == CR_CAP_SIZE) &&
(ce->n_cap_prm == CR_CAP_SIZE) && (ce->n_cap_bnd == CR_CAP_SIZE));
}
static int prepare_creds(int pid, struct task_restore_core_args *args) static int prepare_creds(int pid, struct task_restore_core_args *args)
{ {
int fd, ret; int fd, ret;
CredsEntry *ce;
fd = open_image_ro(CR_FD_CREDS, pid); fd = open_image_ro(CR_FD_CREDS, pid);
if (fd < 0) if (fd < 0)
return fd; return fd;
ret = read_img(fd, &args->creds); ret = pb_read(fd, &ce, creds_entry);
close_safe(&fd); close_safe(&fd);
if (ret < 0)
return ret;
if (!verify_cap_size(ce))
return -1;
args->creds = *ce;
args->creds.cap_inh = args->cap_inh;
memcpy(args->cap_inh, ce->cap_inh, sizeof(args->cap_inh));
args->creds.cap_eff = args->cap_eff;
memcpy(args->cap_eff, ce->cap_eff, sizeof(args->cap_eff));
args->creds.cap_prm = args->cap_prm;
memcpy(args->cap_prm, ce->cap_prm, sizeof(args->cap_prm));
args->creds.cap_bnd = args->cap_bnd;
memcpy(args->cap_bnd, ce->cap_bnd, sizeof(args->cap_bnd));
creds_entry__free_unpacked(ce, NULL);
/* XXX -- validate creds here? */ /* XXX -- validate creds here? */
return ret > 0 ? 0 : -1; return 0;
} }
static struct vma_entry *vma_list_remap(void *addr, unsigned long len, struct list_head *vmas) static struct vma_entry *vma_list_remap(void *addr, unsigned long len, struct list_head *vmas)
......
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#include "protobuf/sa.pb-c.h" #include "protobuf/sa.pb-c.h"
#include "protobuf/itimer.pb-c.h" #include "protobuf/itimer.pb-c.h"
#include "protobuf/mm.pb-c.h" #include "protobuf/mm.pb-c.h"
#include "protobuf/creds.pb-c.h"
#define DEF_PAGES_PER_LINE 6 #define DEF_PAGES_PER_LINE 6
...@@ -298,35 +299,37 @@ out: ...@@ -298,35 +299,37 @@ out:
pr_img_tail(CR_FD_ITIMERS); pr_img_tail(CR_FD_ITIMERS);
} }
static void show_cap(char *name, u32 *v) static void show_cap(char *name, int nr, uint32_t *v)
{ {
int i; int i;
pr_msg("%s: ", name); pr_msg("%s: ", name);
for (i = CR_CAP_SIZE - 1; i >= 0; i--) for (i = nr - 1; i >= 0; i--)
pr_msg("0x%08x", v[i]); pr_msg("0x%08x", v[i]);
pr_msg("\n"); pr_msg("\n");
} }
void show_creds(int fd, struct cr_options *o) void show_creds(int fd, struct cr_options *o)
{ {
struct creds_entry ce; CredsEntry *ce;
pr_img_head(CR_FD_CREDS); pr_img_head(CR_FD_CREDS);
if (read_img(fd, &ce) < 0) if (pb_read(fd, &ce, creds_entry) < 0)
goto out; goto out;
pr_msg("uid %u euid %u suid %u fsuid %u\n", pr_msg("uid %u euid %u suid %u fsuid %u\n",
ce.uid, ce.euid, ce.suid, ce.fsuid); ce->uid, ce->euid, ce->suid, ce->fsuid);
pr_msg("gid %u egid %u sgid %u fsgid %u\n", pr_msg("gid %u egid %u sgid %u fsgid %u\n",
ce.gid, ce.egid, ce.sgid, ce.fsgid); ce->gid, ce->egid, ce->sgid, ce->fsgid);
show_cap("Inh", ce.cap_inh); show_cap("Inh", ce->n_cap_inh, ce->cap_inh);
show_cap("Eff", ce.cap_eff); show_cap("Eff", ce->n_cap_eff, ce->cap_eff);
show_cap("Prm", ce.cap_prm); show_cap("Prm", ce->n_cap_prm, ce->cap_prm);
show_cap("Bnd", ce.cap_bnd); show_cap("Bnd", ce->n_cap_bnd, ce->cap_bnd);
pr_msg("secbits: %#x\n", ce.secbits); pr_msg("secbits: %#x\n", ce->secbits);
creds_entry__free_unpacked(ce, NULL);
out: out:
pr_img_tail(CR_FD_CREDS); pr_img_tail(CR_FD_CREDS);
} }
......
...@@ -91,24 +91,6 @@ struct page_entry { ...@@ -91,24 +91,6 @@ struct page_entry {
#define CR_CAP_SIZE 2 #define CR_CAP_SIZE 2
struct creds_entry {
u32 uid;
u32 gid;
u32 euid;
u32 egid;
u32 suid;
u32 sgid;
u32 fsuid;
u32 fsgid;
u32 cap_inh[CR_CAP_SIZE];
u32 cap_prm[CR_CAP_SIZE];
u32 cap_eff[CR_CAP_SIZE];
u32 cap_bnd[CR_CAP_SIZE];
u32 secbits;
} __packed;
#define HEADER_VERSION 1 #define HEADER_VERSION 1
#define HEADER_ARCH_X86_64 1 #define HEADER_ARCH_X86_64 1
......
...@@ -83,10 +83,10 @@ struct proc_status_creds { ...@@ -83,10 +83,10 @@ struct proc_status_creds {
unsigned int uids[4]; unsigned int uids[4];
unsigned int gids[4]; unsigned int gids[4];
unsigned int cap_inh[PROC_CAP_SIZE]; uint32_t cap_inh[PROC_CAP_SIZE];
unsigned int cap_prm[PROC_CAP_SIZE]; uint32_t cap_prm[PROC_CAP_SIZE];
unsigned int cap_eff[PROC_CAP_SIZE]; uint32_t cap_eff[PROC_CAP_SIZE];
unsigned int cap_bnd[PROC_CAP_SIZE]; uint32_t cap_bnd[PROC_CAP_SIZE];
}; };
struct mount_info { struct mount_info {
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "crtools.h" #include "crtools.h"
#include "../protobuf/mm.pb-c.h" #include "../protobuf/mm.pb-c.h"
#include "../protobuf/creds.pb-c.h"
#ifndef CONFIG_X86_64 #ifndef CONFIG_X86_64
# error Only x86-64 is supported # error Only x86-64 is supported
...@@ -85,7 +86,11 @@ struct task_restore_core_args { ...@@ -85,7 +86,11 @@ struct task_restore_core_args {
struct itimerval itimers[3]; struct itimerval itimers[3];
struct creds_entry creds; CredsEntry creds;
uint32_t cap_inh[CR_CAP_SIZE];
uint32_t cap_prm[CR_CAP_SIZE];
uint32_t cap_eff[CR_CAP_SIZE];
uint32_t cap_bnd[CR_CAP_SIZE];
MmEntry mm; MmEntry mm;
u64 mm_saved_auxv[AT_VECTOR_SIZE]; u64 mm_saved_auxv[AT_VECTOR_SIZE];
......
...@@ -47,6 +47,7 @@ PROTO_FILES += ipc-desc.proto ...@@ -47,6 +47,7 @@ PROTO_FILES += ipc-desc.proto
PROTO_FILES += ipc-shm.proto PROTO_FILES += ipc-shm.proto
PROTO_FILES += ipc-msg.proto PROTO_FILES += ipc-msg.proto
PROTO_FILES += ipc-sem.proto PROTO_FILES += ipc-sem.proto
PROTO_FILES += creds.proto
HDRS := $(patsubst %.proto,%.pb-c.h,$(PROTO_FILES)) HDRS := $(patsubst %.proto,%.pb-c.h,$(PROTO_FILES))
SRCS := $(patsubst %.proto,%.pb-c.c,$(PROTO_FILES)) SRCS := $(patsubst %.proto,%.pb-c.c,$(PROTO_FILES))
......
message creds_entry {
required uint32 uid = 1;
required uint32 gid = 2;
required uint32 euid = 3;
required uint32 egid = 4;
required uint32 suid = 5;
required uint32 sgid = 6;
required uint32 fsuid = 7;
required uint32 fsgid = 8;
repeated uint32 cap_inh = 9;
repeated uint32 cap_prm = 10;
repeated uint32 cap_eff = 11;
repeated uint32 cap_bnd = 12;
required uint32 secbits = 13;
}
...@@ -23,6 +23,8 @@ ...@@ -23,6 +23,8 @@
#include "lock.h" #include "lock.h"
#include "restorer.h" #include "restorer.h"
#include "protobuf/creds.pb-c.h"
#define sys_prctl_safe(opcode, val1, val2, val3) \ #define sys_prctl_safe(opcode, val1, val2, val3) \
({ \ ({ \
long __ret = sys_prctl(opcode, val1, val2, val3, 0); \ long __ret = sys_prctl(opcode, val1, val2, val3, 0); \
...@@ -50,7 +52,7 @@ static void sigchld_handler(int signal, siginfo_t *siginfo, void *data) ...@@ -50,7 +52,7 @@ static void sigchld_handler(int signal, siginfo_t *siginfo, void *data)
sys_exit_group(1); sys_exit_group(1);
} }
static void restore_creds(struct creds_entry *ce) static void restore_creds(CredsEntry *ce)
{ {
int b, i; int b, i;
struct cap_header hdr; struct cap_header hdr;
......
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