umh: simplify the capability pointer logic
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 2 Mar 2023 23:49:44 +0000 (15:49 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 4 Mar 2023 00:18:19 +0000 (16:18 -0800)
The usermodehelper code uses two fake pointers for the two capability
cases: CAP_BSET for reading and writing 'usermodehelper_bset', and
CAP_PI to read and write 'usermodehelper_inheritable'.

This seems to be a completely unnecessary indirection, since we could
instead just use the pointers themselves, and never have to do any "if
this then that" kind of logic.

So just get rid of the fake pointer values, and use the real pointer
values instead.

Reviewed-by: Luis Chamberlain <mcgrof@kernel.org>
Cc: Eric Biederman <ebiederm@xmission.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Kees Cook <keescook@chromium.org>
Cc: Iurii Zaikin <yzaikin@google.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
kernel/umh.c

index 2a47082..60aa9e7 100644 (file)
@@ -32,9 +32,6 @@
 
 #include <trace/events/module.h>
 
-#define CAP_BSET       (void *)1
-#define CAP_PI         (void *)2
-
 static kernel_cap_t usermodehelper_bset = CAP_FULL_SET;
 static kernel_cap_t usermodehelper_inheritable = CAP_FULL_SET;
 static DEFINE_SPINLOCK(umh_sysctl_lock);
@@ -512,16 +509,11 @@ static int proc_cap_handler(struct ctl_table *table, int write,
        /*
         * convert from the global kernel_cap_t to the ulong array to print to
         * userspace if this is a read.
+        *
+        * Legacy format: capabilities are exposed as two 32-bit values
         */
+       cap = table->data;
        spin_lock(&umh_sysctl_lock);
-       if (table->data == CAP_BSET)
-               cap = &usermodehelper_bset;
-       else if (table->data == CAP_PI)
-               cap = &usermodehelper_inheritable;
-       else
-               BUG();
-
-       /* Legacy format: capabilities are exposed as two 32-bit values */
        cap_array[0] = (u32) cap->val;
        cap_array[1] = cap->val >> 32;
        spin_unlock(&umh_sysctl_lock);
@@ -555,14 +547,14 @@ static int proc_cap_handler(struct ctl_table *table, int write,
 struct ctl_table usermodehelper_table[] = {
        {
                .procname       = "bset",
-               .data           = CAP_BSET,
+               .data           = &usermodehelper_bset,
                .maxlen         = 2 * sizeof(unsigned long),
                .mode           = 0600,
                .proc_handler   = proc_cap_handler,
        },
        {
                .procname       = "inheritable",
-               .data           = CAP_PI,
+               .data           = &usermodehelper_inheritable,
                .maxlen         = 2 * sizeof(unsigned long),
                .mode           = 0600,
                .proc_handler   = proc_cap_handler,