diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/s390/kernel/compat_linux.c | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/arch/s390/kernel/compat_linux.c b/arch/s390/kernel/compat_linux.c index d1225089a4bb..73995a725dd1 100644 --- a/arch/s390/kernel/compat_linux.c +++ b/arch/s390/kernel/compat_linux.c | |||
@@ -131,13 +131,19 @@ asmlinkage long sys32_setresuid16(u16 ruid, u16 euid, u16 suid) | |||
131 | low2highuid(suid)); | 131 | low2highuid(suid)); |
132 | } | 132 | } |
133 | 133 | ||
134 | asmlinkage long sys32_getresuid16(u16 __user *ruid, u16 __user *euid, u16 __user *suid) | 134 | asmlinkage long sys32_getresuid16(u16 __user *ruidp, u16 __user *euidp, u16 __user *suidp) |
135 | { | 135 | { |
136 | const struct cred *cred = current_cred(); | ||
136 | int retval; | 137 | int retval; |
138 | u16 ruid, euid, suid; | ||
137 | 139 | ||
138 | if (!(retval = put_user(high2lowuid(current->cred->uid), ruid)) && | 140 | ruid = high2lowuid(from_kuid_munged(cred->user_ns, cred->uid)); |
139 | !(retval = put_user(high2lowuid(current->cred->euid), euid))) | 141 | euid = high2lowuid(from_kuid_munged(cred->user_ns, cred->euid)); |
140 | retval = put_user(high2lowuid(current->cred->suid), suid); | 142 | suid = high2lowuid(from_kuid_munged(cred->user_ns, cred->suid)); |
143 | |||
144 | if (!(retval = put_user(ruid, ruidp)) && | ||
145 | !(retval = put_user(euid, euidp))) | ||
146 | retval = put_user(suid, suidp); | ||
141 | 147 | ||
142 | return retval; | 148 | return retval; |
143 | } | 149 | } |
@@ -148,13 +154,19 @@ asmlinkage long sys32_setresgid16(u16 rgid, u16 egid, u16 sgid) | |||
148 | low2highgid(sgid)); | 154 | low2highgid(sgid)); |
149 | } | 155 | } |
150 | 156 | ||
151 | asmlinkage long sys32_getresgid16(u16 __user *rgid, u16 __user *egid, u16 __user *sgid) | 157 | asmlinkage long sys32_getresgid16(u16 __user *rgidp, u16 __user *egidp, u16 __user *sgidp) |
152 | { | 158 | { |
159 | const struct cred *cred = current_cred(); | ||
153 | int retval; | 160 | int retval; |
161 | u16 rgid, egid, sgid; | ||
162 | |||
163 | rgid = high2lowgid(from_kgid_munged(cred->user_ns, cred->gid)); | ||
164 | egid = high2lowgid(from_kgid_munged(cred->user_ns, cred->egid)); | ||
165 | sgid = high2lowgid(from_kgid_munged(cred->user_ns, cred->sgid)); | ||
154 | 166 | ||
155 | if (!(retval = put_user(high2lowgid(current->cred->gid), rgid)) && | 167 | if (!(retval = put_user(rgid, rgidp)) && |
156 | !(retval = put_user(high2lowgid(current->cred->egid), egid))) | 168 | !(retval = put_user(egid, egidp))) |
157 | retval = put_user(high2lowgid(current->cred->sgid), sgid); | 169 | retval = put_user(sgid, sgidp); |
158 | 170 | ||
159 | return retval; | 171 | return retval; |
160 | } | 172 | } |
@@ -258,22 +270,22 @@ asmlinkage long sys32_setgroups16(int gidsetsize, u16 __user *grouplist) | |||
258 | 270 | ||
259 | asmlinkage long sys32_getuid16(void) | 271 | asmlinkage long sys32_getuid16(void) |
260 | { | 272 | { |
261 | return high2lowuid(current->cred->uid); | 273 | return high2lowuid(from_kuid_munged(current_user_ns(), current_uid())); |
262 | } | 274 | } |
263 | 275 | ||
264 | asmlinkage long sys32_geteuid16(void) | 276 | asmlinkage long sys32_geteuid16(void) |
265 | { | 277 | { |
266 | return high2lowuid(current->cred->euid); | 278 | return high2lowuid(from_kuid_munged(current_user_ns(), current_euid())); |
267 | } | 279 | } |
268 | 280 | ||
269 | asmlinkage long sys32_getgid16(void) | 281 | asmlinkage long sys32_getgid16(void) |
270 | { | 282 | { |
271 | return high2lowgid(current->cred->gid); | 283 | return high2lowgid(from_kgid_munged(current_user_ns(), current_gid())); |
272 | } | 284 | } |
273 | 285 | ||
274 | asmlinkage long sys32_getegid16(void) | 286 | asmlinkage long sys32_getegid16(void) |
275 | { | 287 | { |
276 | return high2lowgid(current->cred->egid); | 288 | return high2lowgid(from_kgid_munged(current_user_ns(), current_egid())); |
277 | } | 289 | } |
278 | 290 | ||
279 | /* | 291 | /* |