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.
Showing the changes to include/uapi/linux/capability.h (1 of 1 file). Show all
Unified · Split
| @@ -41,11 +41,12 @@ typedef struct __user_cap_header_struct { · 40 unmodified lines | |||
| 41 | int pid; | 41 | int pid; |
| 42 | } __user *cap_user_header_t; | 42 | } __user *cap_user_header_t; |
| 43 | 43 | ||
| 44 | typedef struct __user_cap_data_struct { | 44 | struct __user_cap_data_struct { |
| 45 | __u32 effective; | 45 | __u32 effective; |
| 46 | __u32 permitted; | 46 | __u32 permitted; |
| 47 | __u32 inheritable; | 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 | #define VFS_CAP_REVISION_MASK 0xFF000000 | 52 | #define VFS_CAP_REVISION_MASK 0xFF000000 |