0001
0002 #ifndef _LINUX_UIDGID_H
0003 #define _LINUX_UIDGID_H
0004
0005
0006
0007
0008
0009
0010
0011
0012
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
0190
0191 #endif