From 3faaed2f6461d018c8d4e05010967f8085a5a5e5 Mon Sep 17 00:00:00 2001 From: Sophie Blee-Goldman Date: Sat, 9 Aug 2014 09:22:00 +0400 Subject: [PATCH] Bug-fix in size calculation Fixes a bug in how PARASITE_MAX_GROUPS was calculated, and adds a compiler check to assert that parasite_dump_creds doesn't exceed the page size. Signed-off-by: Sophie Blee-Goldman Signed-off-by: Pavel Emelyanov --- include/parasite.h | 7 ++++++- parasite-syscall.c | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/include/parasite.h b/include/parasite.h index eaabc0165..af81d85e2 100644 --- a/include/parasite.h +++ b/include/parasite.h @@ -162,7 +162,12 @@ struct parasite_dump_misc { int dumpable; }; -#define PARASITE_MAX_GROUPS (PAGE_SIZE / sizeof(unsigned int) - 2 * sizeof(unsigned)) +/* + * Calculate how long we can make the groups array in parasite_dump_creds + * and still fit the struct in one page + */ +#define PARASITE_MAX_GROUPS \ + ((PAGE_SIZE - 2 * sizeof(unsigned int)) / sizeof(unsigned int)) struct parasite_dump_creds { unsigned int secbits; diff --git a/parasite-syscall.c b/parasite-syscall.c index f26503a4a..dad257019 100644 --- a/parasite-syscall.c +++ b/parasite-syscall.c @@ -735,6 +735,8 @@ int parasite_dump_creds(struct parasite_ctl *ctl, CredsEntry *ce) { struct parasite_dump_creds *pc; + BUILD_BUG_ON(sizeof(*pc) > PAGE_SIZE); + pc = parasite_args(ctl, struct parasite_dump_creds); if (parasite_execute_daemon(PARASITE_CMD_DUMP_CREDS, ctl) < 0) return -1;