Commit 1c1e618ddd15f69fd87ccea596769f78c8065504

Authored by Jiri Slaby
1 parent 7855c35da7

rlimits: allow setrlimit to non-current tasks

Add locking to allow setrlimit accept task parameter other than
current.

Namely, lock tasklist_lock for read and check whether the task
structure has sighand non-null. Do all the signal processing under
that lock still held.

There are some points:
1) security_task_setrlimit is now called with that lock held. This is
   not new, many security_* functions are called with this lock held
   already so it doesn't harm (all this security_* stuff does almost
   the same).
2) task->sighand->siglock (in update_rlimit_cpu) is nested in
   tasklist_lock. This dependence is already existing.
3) tsk->alloc_lock is nested in tasklist_lock. This is OK too, already
   existing dependence.

Signed-off-by: Jiri Slaby <jirislaby@gmail.com>
Cc: Oleg Nesterov <oleg@redhat.com>

Showing 1 changed file with 10 additions and 1 deletions Side-by-side Diff

... ... @@ -1272,6 +1272,7 @@
1272 1272  
1273 1273 #endif
1274 1274  
  1275 +/* make sure you are allowed to change @tsk limits before calling this */
1275 1276 int do_setrlimit(struct task_struct *tsk, unsigned int resource,
1276 1277 struct rlimit *new_rlim)
1277 1278 {
1278 1279  
... ... @@ -1285,9 +1286,16 @@
1285 1286 if (resource == RLIMIT_NOFILE && new_rlim->rlim_max > sysctl_nr_open)
1286 1287 return -EPERM;
1287 1288  
  1289 + /* protect tsk->signal and tsk->sighand from disappearing */
  1290 + read_lock(&tasklist_lock);
  1291 + if (!tsk->sighand) {
  1292 + retval = -ESRCH;
  1293 + goto out;
  1294 + }
  1295 +
1288 1296 retval = security_task_setrlimit(tsk->group_leader, resource, new_rlim);
1289 1297 if (retval)
1290   - return retval;
  1298 + goto out;
1291 1299  
1292 1300 if (resource == RLIMIT_CPU && new_rlim->rlim_cur == 0) {
1293 1301 /*
... ... @@ -1322,6 +1330,7 @@
1322 1330  
1323 1331 update_rlimit_cpu(tsk, new_rlim->rlim_cur);
1324 1332 out:
  1333 + read_unlock(&tasklist_lock);
1325 1334 return retval;
1326 1335 }
1327 1336