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