Message ID | 20211210182058.43417-1-dave@stgolabs.net (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | block: fix ioprio_get(IOPRIO_WHO_PGRP) vs setuid(2) | expand |
On Fri, 10 Dec 2021 10:20:58 -0800, Davidlohr Bueso wrote: > do_each_pid_thread(PIDTYPE_PGID) can race with a concurrent > change_pid(PIDTYPE_PGID) that can move the task from one hlist > to another while iterating. Serialize ioprio_get to take > the tasklist_lock in this case, just like it's set counterpart. > > Applied, thanks! [1/1] block: fix ioprio_get(IOPRIO_WHO_PGRP) vs setuid(2) commit: e6a59aac8a8713f335a37d762db0dbe80e7f6d38 Best regards,
diff --git a/block/ioprio.c b/block/ioprio.c index 313c14a70bbd..6f01d35a5145 100644 --- a/block/ioprio.c +++ b/block/ioprio.c @@ -220,6 +220,7 @@ SYSCALL_DEFINE2(ioprio_get, int, which, int, who) pgrp = task_pgrp(current); else pgrp = find_vpid(who); + read_lock(&tasklist_lock); do_each_pid_thread(pgrp, PIDTYPE_PGID, p) { tmpio = get_task_ioprio(p); if (tmpio < 0) @@ -229,6 +230,8 @@ SYSCALL_DEFINE2(ioprio_get, int, which, int, who) else ret = ioprio_best(ret, tmpio); } while_each_pid_thread(pgrp, PIDTYPE_PGID, p); + read_unlock(&tasklist_lock); + break; case IOPRIO_WHO_USER: uid = make_kuid(current_user_ns(), who);