On Sat, Nov 16, 2013 at 11:01 AM, Oleg Nesterov <oleg@xxxxxxxxxx> wrote: > Nobody actually needs MMF_DUMPABLE/MMF_DUMP_SECURELY, there > are only used to enforce the encoding of SUID_DUMP_* enum in > mm->flags & MMF_DUMPABLE_MASK. > > Now that set_dumpable() updates both bits atomically we can > kill them and simply store the value "as is" in 2 lower bits. > > Signed-off-by: Oleg Nesterov <oleg@xxxxxxxxxx> > --- > fs/exec.c | 18 +++--------------- > include/linux/sched.h | 4 +--- > 2 files changed, 4 insertions(+), 18 deletions(-) > > diff --git a/fs/exec.c b/fs/exec.c > index 613c9dc..5303005 100644 > --- a/fs/exec.c > +++ b/fs/exec.c > @@ -1620,8 +1620,7 @@ void set_binfmt(struct linux_binfmt *new) > EXPORT_SYMBOL(set_binfmt); > > /* > - * set_dumpable converts traditional three-value dumpable to two flags and > - * stores them into mm->flags. > + * set_dumpable stores three-value SUID_DUMP_* into mm->flags. > */ > void set_dumpable(struct mm_struct *mm, int value) > { > @@ -1629,24 +1628,13 @@ void set_dumpable(struct mm_struct *mm, int value) > > do { > old = ACCESS_ONCE(mm->flags); > - new = old & ~MMF_DUMPABLE_MASK; > - > - switch (value) { > - case SUID_DUMP_ROOT: > - new |= (1 << MMF_DUMP_SECURELY); > - case SUID_DUMP_USER: > - new |= (1<< MMF_DUMPABLE); > - } > - > + new = (old & ~MMF_DUMPABLE_MASK) | value; Just to make this safe against insane callers, perhaps mask the value as well? new = (old & ~MMF_DUMPABLE_MASK) | (value & MMF_DUMPABLE_MASK); > } while (cmpxchg(&mm->flags, old, new) != old); > } > > int __get_dumpable(unsigned long mm_flags) > { > - int ret; > - > - ret = mm_flags & MMF_DUMPABLE_MASK; > - return (ret > SUID_DUMP_USER) ? SUID_DUMP_ROOT : ret; > + return mm_flags & MMF_DUMPABLE_MASK; > } > > /* > diff --git a/include/linux/sched.h b/include/linux/sched.h > index 838a3d9..828c00d 100644 > --- a/include/linux/sched.h > +++ b/include/linux/sched.h > @@ -326,10 +326,8 @@ extern int get_dumpable(struct mm_struct *mm); > #define SUID_DUMP_ROOT 2 /* Dump as root */ > > /* mm flags */ > -/* dumpable bits */ > -#define MMF_DUMPABLE 0 /* core dump is permitted */ > -#define MMF_DUMP_SECURELY 1 /* core file is readable only by root */ > > +/* for SUID_DUMP_* above */ > #define MMF_DUMPABLE_BITS 2 > #define MMF_DUMPABLE_MASK ((1 << MMF_DUMPABLE_BITS) - 1) Besides that, looks great. -Kees -- Kees Cook Chrome OS Security -- To unsubscribe from this list: send the line "unsubscribe linux-arch" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html