Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef _LINUX_UIDGID_H
0003 #define _LINUX_UIDGID_H
0004 
0005 /*
0006  * A set of types for the internal kernel types representing uids and gids.
0007  *
0008  * The types defined in this header allow distinguishing which uids and gids in
0009  * the kernel are values used by userspace and which uid and gid values are
0010  * the internal kernel values.  With the addition of user namespaces the values
0011  * can be different.  Using the type system makes it possible for the compiler
0012  * to detect when we overlook these differences.
0013  *
0014  */
0015 #include <linux/types.h>
0016 #include <linux/highuid.h>
0017 
0018 struct user_namespace;
0019 extern struct user_namespace init_user_ns;
0020 
0021 typedef struct {
0022     uid_t val;
0023 } kuid_t;
0024 
0025 
0026 typedef struct {
0027     gid_t val;
0028 } kgid_t;
0029 
0030 #define KUIDT_INIT(value) (kuid_t){ value }
0031 #define KGIDT_INIT(value) (kgid_t){ value }
0032 
0033 #ifdef CONFIG_MULTIUSER
0034 static inline uid_t __kuid_val(kuid_t uid)
0035 {
0036     return uid.val;
0037 }
0038 
0039 static inline gid_t __kgid_val(kgid_t gid)
0040 {
0041     return gid.val;
0042 }
0043 #else
0044 static inline uid_t __kuid_val(kuid_t uid)
0045 {
0046     return 0;
0047 }
0048 
0049 static inline gid_t __kgid_val(kgid_t gid)
0050 {
0051     return 0;
0052 }
0053 #endif
0054 
0055 #define GLOBAL_ROOT_UID KUIDT_INIT(0)
0056 #define GLOBAL_ROOT_GID KGIDT_INIT(0)
0057 
0058 #define INVALID_UID KUIDT_INIT(-1)
0059 #define INVALID_GID KGIDT_INIT(-1)
0060 
0061 static inline bool uid_eq(kuid_t left, kuid_t right)
0062 {
0063     return __kuid_val(left) == __kuid_val(right);
0064 }
0065 
0066 static inline bool gid_eq(kgid_t left, kgid_t right)
0067 {
0068     return __kgid_val(left) == __kgid_val(right);
0069 }
0070 
0071 static inline bool uid_gt(kuid_t left, kuid_t right)
0072 {
0073     return __kuid_val(left) > __kuid_val(right);
0074 }
0075 
0076 static inline bool gid_gt(kgid_t left, kgid_t right)
0077 {
0078     return __kgid_val(left) > __kgid_val(right);
0079 }
0080 
0081 static inline bool uid_gte(kuid_t left, kuid_t right)
0082 {
0083     return __kuid_val(left) >= __kuid_val(right);
0084 }
0085 
0086 static inline bool gid_gte(kgid_t left, kgid_t right)
0087 {
0088     return __kgid_val(left) >= __kgid_val(right);
0089 }
0090 
0091 static inline bool uid_lt(kuid_t left, kuid_t right)
0092 {
0093     return __kuid_val(left) < __kuid_val(right);
0094 }
0095 
0096 static inline bool gid_lt(kgid_t left, kgid_t right)
0097 {
0098     return __kgid_val(left) < __kgid_val(right);
0099 }
0100 
0101 static inline bool uid_lte(kuid_t left, kuid_t right)
0102 {
0103     return __kuid_val(left) <= __kuid_val(right);
0104 }
0105 
0106 static inline bool gid_lte(kgid_t left, kgid_t right)
0107 {
0108     return __kgid_val(left) <= __kgid_val(right);
0109 }
0110 
0111 static inline bool uid_valid(kuid_t uid)
0112 {
0113     return __kuid_val(uid) != (uid_t) -1;
0114 }
0115 
0116 static inline bool gid_valid(kgid_t gid)
0117 {
0118     return __kgid_val(gid) != (gid_t) -1;
0119 }
0120 
0121 #ifdef CONFIG_USER_NS
0122 
0123 extern kuid_t make_kuid(struct user_namespace *from, uid_t uid);
0124 extern kgid_t make_kgid(struct user_namespace *from, gid_t gid);
0125 
0126 extern uid_t from_kuid(struct user_namespace *to, kuid_t uid);
0127 extern gid_t from_kgid(struct user_namespace *to, kgid_t gid);
0128 extern uid_t from_kuid_munged(struct user_namespace *to, kuid_t uid);
0129 extern gid_t from_kgid_munged(struct user_namespace *to, kgid_t gid);
0130 
0131 static inline bool kuid_has_mapping(struct user_namespace *ns, kuid_t uid)
0132 {
0133     return from_kuid(ns, uid) != (uid_t) -1;
0134 }
0135 
0136 static inline bool kgid_has_mapping(struct user_namespace *ns, kgid_t gid)
0137 {
0138     return from_kgid(ns, gid) != (gid_t) -1;
0139 }
0140 
0141 #else
0142 
0143 static inline kuid_t make_kuid(struct user_namespace *from, uid_t uid)
0144 {
0145     return KUIDT_INIT(uid);
0146 }
0147 
0148 static inline kgid_t make_kgid(struct user_namespace *from, gid_t gid)
0149 {
0150     return KGIDT_INIT(gid);
0151 }
0152 
0153 static inline uid_t from_kuid(struct user_namespace *to, kuid_t kuid)
0154 {
0155     return __kuid_val(kuid);
0156 }
0157 
0158 static inline gid_t from_kgid(struct user_namespace *to, kgid_t kgid)
0159 {
0160     return __kgid_val(kgid);
0161 }
0162 
0163 static inline uid_t from_kuid_munged(struct user_namespace *to, kuid_t kuid)
0164 {
0165     uid_t uid = from_kuid(to, kuid);
0166     if (uid == (uid_t)-1)
0167         uid = overflowuid;
0168     return uid;
0169 }
0170 
0171 static inline gid_t from_kgid_munged(struct user_namespace *to, kgid_t kgid)
0172 {
0173     gid_t gid = from_kgid(to, kgid);
0174     if (gid == (gid_t)-1)
0175         gid = overflowgid;
0176     return gid;
0177 }
0178 
0179 static inline bool kuid_has_mapping(struct user_namespace *ns, kuid_t uid)
0180 {
0181     return uid_valid(uid);
0182 }
0183 
0184 static inline bool kgid_has_mapping(struct user_namespace *ns, kgid_t gid)
0185 {
0186     return gid_valid(gid);
0187 }
0188 
0189 #endif /* CONFIG_USER_NS */
0190 
0191 #endif /* _LINUX_UIDGID_H */