diff options
Diffstat (limited to 'fs/ioprio.c')
-rw-r--r-- | fs/ioprio.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/fs/ioprio.c b/fs/ioprio.c index 0f1b9515213b..5e6dbe8958fc 100644 --- a/fs/ioprio.c +++ b/fs/ioprio.c | |||
@@ -37,8 +37,8 @@ int set_task_ioprio(struct task_struct *task, int ioprio) | |||
37 | 37 | ||
38 | rcu_read_lock(); | 38 | rcu_read_lock(); |
39 | tcred = __task_cred(task); | 39 | tcred = __task_cred(task); |
40 | if (tcred->uid != cred->euid && | 40 | if (!uid_eq(tcred->uid, cred->euid) && |
41 | tcred->uid != cred->uid && !capable(CAP_SYS_NICE)) { | 41 | !uid_eq(tcred->uid, cred->uid) && !capable(CAP_SYS_NICE)) { |
42 | rcu_read_unlock(); | 42 | rcu_read_unlock(); |
43 | return -EPERM; | 43 | return -EPERM; |
44 | } | 44 | } |
@@ -65,6 +65,7 @@ SYSCALL_DEFINE3(ioprio_set, int, which, int, who, int, ioprio) | |||
65 | struct task_struct *p, *g; | 65 | struct task_struct *p, *g; |
66 | struct user_struct *user; | 66 | struct user_struct *user; |
67 | struct pid *pgrp; | 67 | struct pid *pgrp; |
68 | kuid_t uid; | ||
68 | int ret; | 69 | int ret; |
69 | 70 | ||
70 | switch (class) { | 71 | switch (class) { |
@@ -110,16 +111,19 @@ SYSCALL_DEFINE3(ioprio_set, int, which, int, who, int, ioprio) | |||
110 | } while_each_pid_thread(pgrp, PIDTYPE_PGID, p); | 111 | } while_each_pid_thread(pgrp, PIDTYPE_PGID, p); |
111 | break; | 112 | break; |
112 | case IOPRIO_WHO_USER: | 113 | case IOPRIO_WHO_USER: |
114 | uid = make_kuid(current_user_ns(), who); | ||
115 | if (!uid_valid(uid)) | ||
116 | break; | ||
113 | if (!who) | 117 | if (!who) |
114 | user = current_user(); | 118 | user = current_user(); |
115 | else | 119 | else |
116 | user = find_user(who); | 120 | user = find_user(uid); |
117 | 121 | ||
118 | if (!user) | 122 | if (!user) |
119 | break; | 123 | break; |
120 | 124 | ||
121 | do_each_thread(g, p) { | 125 | do_each_thread(g, p) { |
122 | if (__task_cred(p)->uid != who) | 126 | if (!uid_eq(task_uid(p), uid)) |
123 | continue; | 127 | continue; |
124 | ret = set_task_ioprio(p, ioprio); | 128 | ret = set_task_ioprio(p, ioprio); |
125 | if (ret) | 129 | if (ret) |
@@ -174,6 +178,7 @@ SYSCALL_DEFINE2(ioprio_get, int, which, int, who) | |||
174 | struct task_struct *g, *p; | 178 | struct task_struct *g, *p; |
175 | struct user_struct *user; | 179 | struct user_struct *user; |
176 | struct pid *pgrp; | 180 | struct pid *pgrp; |
181 | kuid_t uid; | ||
177 | int ret = -ESRCH; | 182 | int ret = -ESRCH; |
178 | int tmpio; | 183 | int tmpio; |
179 | 184 | ||
@@ -203,16 +208,17 @@ SYSCALL_DEFINE2(ioprio_get, int, which, int, who) | |||
203 | } while_each_pid_thread(pgrp, PIDTYPE_PGID, p); | 208 | } while_each_pid_thread(pgrp, PIDTYPE_PGID, p); |
204 | break; | 209 | break; |
205 | case IOPRIO_WHO_USER: | 210 | case IOPRIO_WHO_USER: |
211 | uid = make_kuid(current_user_ns(), who); | ||
206 | if (!who) | 212 | if (!who) |
207 | user = current_user(); | 213 | user = current_user(); |
208 | else | 214 | else |
209 | user = find_user(who); | 215 | user = find_user(uid); |
210 | 216 | ||
211 | if (!user) | 217 | if (!user) |
212 | break; | 218 | break; |
213 | 219 | ||
214 | do_each_thread(g, p) { | 220 | do_each_thread(g, p) { |
215 | if (__task_cred(p)->uid != user->uid) | 221 | if (!uid_eq(task_uid(p), user->uid)) |
216 | continue; | 222 | continue; |
217 | tmpio = get_task_ioprio(p); | 223 | tmpio = get_task_ioprio(p); |
218 | if (tmpio < 0) | 224 | if (tmpio < 0) |