Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */
2 : : #ifndef _LINUX_UIDGID_H
3 : : #define _LINUX_UIDGID_H
4 : :
5 : : /*
6 : : * A set of types for the internal kernel types representing uids and gids.
7 : : *
8 : : * The types defined in this header allow distinguishing which uids and gids in
9 : : * the kernel are values used by userspace and which uid and gid values are
10 : : * the internal kernel values. With the addition of user namespaces the values
11 : : * can be different. Using the type system makes it possible for the compiler
12 : : * to detect when we overlook these differences.
13 : : *
14 : : */
15 : : #include <linux/types.h>
16 : : #include <linux/highuid.h>
17 : :
18 : : struct user_namespace;
19 : : extern struct user_namespace init_user_ns;
20 : :
21 : : typedef struct {
22 : : uid_t val;
23 : : } kuid_t;
24 : :
25 : :
26 : : typedef struct {
27 : : gid_t val;
28 : : } kgid_t;
29 : :
30 : : #define KUIDT_INIT(value) (kuid_t){ value }
31 : : #define KGIDT_INIT(value) (kgid_t){ value }
32 : :
33 : : #ifdef CONFIG_MULTIUSER
34 : 5041979 : static inline uid_t __kuid_val(kuid_t uid)
35 : : {
36 [ - + ]: 5041082 : return uid.val;
37 : : }
38 : :
39 : 2209133 : static inline gid_t __kgid_val(kgid_t gid)
40 : : {
41 : 2209133 : return gid.val;
42 : : }
43 : : #else
44 : : static inline uid_t __kuid_val(kuid_t uid)
45 : : {
46 : : return 0;
47 : : }
48 : :
49 : : static inline gid_t __kgid_val(kgid_t gid)
50 : : {
51 : : return 0;
52 : : }
53 : : #endif
54 : :
55 : : #define GLOBAL_ROOT_UID KUIDT_INIT(0)
56 : : #define GLOBAL_ROOT_GID KGIDT_INIT(0)
57 : :
58 : : #define INVALID_UID KUIDT_INIT(-1)
59 : : #define INVALID_GID KGIDT_INIT(-1)
60 : :
61 : 3751288 : static inline bool uid_eq(kuid_t left, kuid_t right)
62 : : {
63 [ + + + + : 3723704 : return __kuid_val(left) == __kuid_val(right);
+ + + + +
+ + - + +
+ + - + -
- + + + +
+ - + + +
+ + + + -
+ - + + -
+ - - + +
+ + + - -
- - - + +
- + + + -
- - - - -
- - - - -
- - - ]
64 : : }
65 : :
66 : 909328 : static inline bool gid_eq(kgid_t left, kgid_t right)
67 : : {
68 [ + + + + : 885319 : return __kgid_val(left) == __kgid_val(right);
+ + + + +
+ + - - +
- - - - -
- - - - -
- - - - -
- - - - -
- - - - +
- + + - -
- - - - -
- ]
69 : : }
70 : :
71 : 845 : static inline bool uid_gt(kuid_t left, kuid_t right)
72 : : {
73 [ + + ]: 845 : return __kuid_val(left) > __kuid_val(right);
74 : : }
75 : :
76 : 16952 : static inline bool gid_gt(kgid_t left, kgid_t right)
77 : : {
78 [ - + + + : 16952 : return __kgid_val(left) > __kgid_val(right);
- - ]
79 : : }
80 : :
81 : 0 : static inline bool uid_gte(kuid_t left, kuid_t right)
82 : : {
83 : 0 : return __kuid_val(left) >= __kuid_val(right);
84 : : }
85 : :
86 : 0 : static inline bool gid_gte(kgid_t left, kgid_t right)
87 : : {
88 : 0 : return __kgid_val(left) >= __kgid_val(right);
89 : : }
90 : :
91 : 845 : static inline bool uid_lt(kuid_t left, kuid_t right)
92 : : {
93 [ - + ]: 845 : return __kuid_val(left) < __kuid_val(right);
94 : : }
95 : :
96 : 6292 : static inline bool gid_lt(kgid_t left, kgid_t right)
97 : : {
98 [ + - + + : 6292 : return __kgid_val(left) < __kgid_val(right);
- - ]
99 : : }
100 : :
101 : 0 : static inline bool uid_lte(kuid_t left, kuid_t right)
102 : : {
103 : 0 : return __kuid_val(left) <= __kuid_val(right);
104 : : }
105 : :
106 : 0 : static inline bool gid_lte(kgid_t left, kgid_t right)
107 : : {
108 [ # # # # : 0 : return __kgid_val(left) <= __kgid_val(right);
# # # # ]
109 : : }
110 : :
111 : 710285 : static inline bool uid_valid(kuid_t uid)
112 : : {
113 [ + - + - : 686521 : return __kuid_val(uid) != (uid_t) -1;
+ - - - +
- ]
114 : : }
115 : :
116 : 710350 : static inline bool gid_valid(kgid_t gid)
117 : : {
118 [ + + + - : 686599 : return __kgid_val(gid) != (gid_t) -1;
- + - + ]
119 : : }
120 : :
121 : : #ifdef CONFIG_USER_NS
122 : :
123 : : extern kuid_t make_kuid(struct user_namespace *from, uid_t uid);
124 : : extern kgid_t make_kgid(struct user_namespace *from, gid_t gid);
125 : :
126 : : extern uid_t from_kuid(struct user_namespace *to, kuid_t uid);
127 : : extern gid_t from_kgid(struct user_namespace *to, kgid_t gid);
128 : : extern uid_t from_kuid_munged(struct user_namespace *to, kuid_t uid);
129 : : extern gid_t from_kgid_munged(struct user_namespace *to, kgid_t gid);
130 : :
131 : : static inline bool kuid_has_mapping(struct user_namespace *ns, kuid_t uid)
132 : : {
133 : : return from_kuid(ns, uid) != (uid_t) -1;
134 : : }
135 : :
136 : : static inline bool kgid_has_mapping(struct user_namespace *ns, kgid_t gid)
137 : : {
138 : : return from_kgid(ns, gid) != (gid_t) -1;
139 : : }
140 : :
141 : : #else
142 : :
143 : 341979 : static inline kuid_t make_kuid(struct user_namespace *from, uid_t uid)
144 : : {
145 [ + + + + : 341979 : return KUIDT_INIT(uid);
- - - - -
- - - ]
146 : : }
147 : :
148 : 277274 : static inline kgid_t make_kgid(struct user_namespace *from, gid_t gid)
149 : : {
150 [ + - + - : 277274 : return KGIDT_INIT(gid);
- - ]
151 : : }
152 : :
153 : 577741 : static inline uid_t from_kuid(struct user_namespace *to, kuid_t kuid)
154 : : {
155 [ + - # # : 577741 : return __kuid_val(kuid);
# # ]
156 : : }
157 : :
158 : 566211 : static inline gid_t from_kgid(struct user_namespace *to, kgid_t kgid)
159 : : {
160 [ + - ]: 566211 : return __kgid_val(kgid);
161 : : }
162 : :
163 : 511615 : static inline uid_t from_kuid_munged(struct user_namespace *to, kuid_t kuid)
164 : : {
165 : 511615 : uid_t uid = from_kuid(to, kuid);
166 [ - + - + : 511615 : if (uid == (uid_t)-1)
- + - + -
- - + - -
- - ]
167 : 0 : uid = overflowuid;
168 [ + + - - : 504815 : return uid;
- + - - #
# ]
169 : : }
170 : :
171 : 500477 : static inline gid_t from_kgid_munged(struct user_namespace *to, kgid_t kgid)
172 : : {
173 : 500477 : gid_t gid = from_kgid(to, kgid);
174 [ - + - + : 500464 : if (gid == (gid_t)-1)
- + - + -
- - - # #
# # ]
175 : 0 : gid = overflowgid;
176 [ - + - - : 495569 : return gid;
# # # # #
# # # ]
177 : : }
178 : :
179 : 32474 : static inline bool kuid_has_mapping(struct user_namespace *ns, kuid_t uid)
180 : : {
181 [ + - + - ]: 32474 : return uid_valid(uid);
182 : : }
183 : :
184 : 32448 : static inline bool kgid_has_mapping(struct user_namespace *ns, kgid_t gid)
185 : : {
186 [ + + + - ]: 32448 : return gid_valid(gid);
187 : : }
188 : :
189 : : #endif /* CONFIG_USER_NS */
190 : :
191 : : #endif /* _LINUX_UIDGID_H */
|