Skip to content

Commit

Permalink
fault-inject: simplify access check for fail-nth
Browse files Browse the repository at this point in the history
The fail-nth file is created with 0666 and the access is permitted if
and only if the task is current.

This file is owned by the currnet user.  So we can create it with 0644
and allow the owner to write it.  This enables to watch the status of
task->fail_nth from another processes.

[[email protected]: don't convert unsigned type value as signed int]
  Link: http://lkml.kernel.org/r/[email protected]
[[email protected]: avoid unwanted data race to task->fail_nth]
  Link: http://lkml.kernel.org/r/[email protected]
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Akinobu Mita <[email protected]>
Acked-by: Dmitry Vyukov <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
mita authored and torvalds committed Jul 14, 2017
1 parent bfc7409 commit 1203c8e
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 17 deletions.
25 changes: 10 additions & 15 deletions fs/proc/base.c
Original file line number Diff line number Diff line change
Expand Up @@ -1363,16 +1363,16 @@ static ssize_t proc_fail_nth_write(struct file *file, const char __user *buf,
int err;
unsigned int n;

err = kstrtouint_from_user(buf, count, 0, &n);
if (err)
return err;

task = get_proc_task(file_inode(file));
if (!task)
return -ESRCH;
WRITE_ONCE(task->fail_nth, n);
put_task_struct(task);
if (task != current)
return -EPERM;
err = kstrtouint_from_user(buf, count, 0, &n);
if (err)
return err;
current->fail_nth = n;

return count;
}

Expand All @@ -1386,11 +1386,10 @@ static ssize_t proc_fail_nth_read(struct file *file, char __user *buf,
task = get_proc_task(file_inode(file));
if (!task)
return -ESRCH;
put_task_struct(task);
if (task != current)
return -EPERM;
len = snprintf(numbuf, sizeof(numbuf), "%u\n", task->fail_nth);
len = snprintf(numbuf, sizeof(numbuf), "%u\n",
READ_ONCE(task->fail_nth));
len = simple_read_from_buffer(buf, count, ppos, numbuf, len);
put_task_struct(task);

return len;
}
Expand Down Expand Up @@ -3355,11 +3354,7 @@ static const struct pid_entry tid_base_stuff[] = {
#endif
#ifdef CONFIG_FAULT_INJECTION
REG("make-it-fail", S_IRUGO|S_IWUSR, proc_fault_inject_operations),
/*
* Operations on the file check that the task is current,
* so we create it with 0666 to support testing under unprivileged user.
*/
REG("fail-nth", 0666, proc_fail_nth_operations),
REG("fail-nth", 0644, proc_fail_nth_operations),
#endif
#ifdef CONFIG_TASK_IO_ACCOUNTING
ONE("io", S_IRUSR, proc_tid_io_accounting),
Expand Down
7 changes: 5 additions & 2 deletions lib/fault-inject.c
Original file line number Diff line number Diff line change
Expand Up @@ -107,9 +107,12 @@ static inline bool fail_stacktrace(struct fault_attr *attr)

bool should_fail(struct fault_attr *attr, ssize_t size)
{
if (in_task() && current->fail_nth) {
if (--current->fail_nth == 0)
if (in_task()) {
unsigned int fail_nth = READ_ONCE(current->fail_nth);

if (fail_nth && !WRITE_ONCE(current->fail_nth, fail_nth - 1))
goto fail;

return false;
}

Expand Down

0 comments on commit 1203c8e

Please sign in to comment.