Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

capability: erase checker warnings about struct __user_cap_data_struct

Currently Sparse warns the following when compiling kernel/capability.c:

kernel/capability.c:191:35: warning: incorrect type in argument 2
(different address spaces)
kernel/capability.c:191:35: expected void const *from
kernel/capability.c:191:35: got struct __user_cap_data_struct
[noderef] __user *
kernel/capability.c:168:14: warning: dereference of noderef expression
...... (multiple noderef warnings on different locations)
kernel/capability.c:244:29: warning: incorrect type in argument 1
(different address spaces)
kernel/capability.c:244:29: expected void *to
kernel/capability.c:244:29: got struct __user_cap_data_struct
[noderef] __user ( * )[2]
kernel/capability.c:247:42: warning: dereference of noderef expression
...... (multiple noderef warnings on different locations)

It seems that defining `struct __user_cap_data_struct` together with
`cap_user_data_t` make Sparse believe that the struct is `noderef` as
well. Separate their definitions to clarify their respective attributes.

Signed-off-by: GONG, Ruiqi <gongruiqi@huaweicloud.com>
Acked-by: Serge Hallyn <serge@hallyn.com>
[PM: wrapped long lines in the description]
Signed-off-by: Paul Moore <paul@paul-moore.com>

authored by

GONG, Ruiqi and committed by
Paul Moore
55382134 4432b507

+3 -2
+3 -2
include/uapi/linux/capability.h
··· 41 41 int pid; 42 42 } __user *cap_user_header_t; 43 43 44 - typedef struct __user_cap_data_struct { 44 + struct __user_cap_data_struct { 45 45 __u32 effective; 46 46 __u32 permitted; 47 47 __u32 inheritable; 48 - } __user *cap_user_data_t; 48 + }; 49 + typedef struct __user_cap_data_struct __user *cap_user_data_t; 49 50 50 51 51 52 #define VFS_CAP_REVISION_MASK 0xFF000000