Skip to content

Commit

Permalink
capabilities: remove task_ns_* functions
Browse files Browse the repository at this point in the history
task_ in the front of a function, in the security subsystem anyway, means
to me at least, that we are operating with that task as the subject of the
security decision.  In this case what it means is that we are using current as
the subject but we use the task to get the right namespace.  Who in the world
would ever realize that's what task_ns_capability means just by the name?  This
patch eliminates the task_ns functions entirely and uses the has_ns_capability
function instead.  This means we explicitly open code the ns in question in
the caller.  I think it makes the caller a LOT more clear what is going on.

Signed-off-by: Eric Paris <[email protected]>
Acked-by: Serge E. Hallyn <[email protected]>
  • Loading branch information
eparis committed Jan 5, 2012
1 parent d2a7009 commit f1c84da
Show file tree
Hide file tree
Showing 5 changed files with 7 additions and 20 deletions.
1 change: 0 additions & 1 deletion include/linux/capability.h
Original file line number Diff line number Diff line change
Expand Up @@ -547,7 +547,6 @@ extern bool has_ns_capability_noaudit(struct task_struct *t,
struct user_namespace *ns, int cap);
extern bool capable(int cap);
extern bool ns_capable(struct user_namespace *ns, int cap);
extern bool task_ns_capable(struct task_struct *t, int cap);
extern bool nsown_capable(int cap);

/* audit system wants to get cap info from files as well */
Expand Down
6 changes: 4 additions & 2 deletions include/linux/cred.h
Original file line number Diff line number Diff line change
Expand Up @@ -358,10 +358,12 @@ static inline void put_cred(const struct cred *_cred)
#define current_security() (current_cred_xxx(security))

#ifdef CONFIG_USER_NS
#define current_user_ns() (current_cred_xxx(user_ns))
#define current_user_ns() (current_cred_xxx(user_ns))
#define task_user_ns(task) (task_cred_xxx((task), user_ns))
#else
extern struct user_namespace init_user_ns;
#define current_user_ns() (&init_user_ns)
#define current_user_ns() (&init_user_ns)
#define task_user_ns(task) (&init_user_ns)
#endif


Expand Down
14 changes: 0 additions & 14 deletions kernel/capability.c
Original file line number Diff line number Diff line change
Expand Up @@ -408,20 +408,6 @@ bool capable(int cap)
}
EXPORT_SYMBOL(capable);

/**
* task_ns_capable - Determine whether current task has a superior
* capability targeted at a specific task's user namespace.
* @t: The task whose user namespace is targeted.
* @cap: The capability in question.
*
* Return true if it does, false otherwise.
*/
bool task_ns_capable(struct task_struct *t, int cap)
{
return ns_capable(task_cred_xxx(t, user)->user_ns, cap);
}
EXPORT_SYMBOL(task_ns_capable);

/**
* nsown_capable - Check superior capability to one's own user_ns
* @cap: The capability in question
Expand Down
4 changes: 2 additions & 2 deletions kernel/ptrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ int __ptrace_may_access(struct task_struct *task, unsigned int mode)
smp_rmb();
if (task->mm)
dumpable = get_dumpable(task->mm);
if (!dumpable && !task_ns_capable(task, CAP_SYS_PTRACE))
if (!dumpable && !ns_capable(task_user_ns(task), CAP_SYS_PTRACE))
return -EPERM;

return security_ptrace_access_check(task, mode);
Expand Down Expand Up @@ -266,7 +266,7 @@ static int ptrace_attach(struct task_struct *task, long request,
task->ptrace = PT_PTRACED;
if (seize)
task->ptrace |= PT_SEIZED;
if (task_ns_capable(task, CAP_SYS_PTRACE))
if (ns_capable(task_user_ns(task), CAP_SYS_PTRACE))
task->ptrace |= PT_PTRACE_CAP;

__ptrace_link(task, current);
Expand Down
2 changes: 1 addition & 1 deletion kernel/sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -5409,7 +5409,7 @@ long sched_setaffinity(pid_t pid, const struct cpumask *in_mask)
goto out_free_cpus_allowed;
}
retval = -EPERM;
if (!check_same_owner(p) && !task_ns_capable(p, CAP_SYS_NICE))
if (!check_same_owner(p) && !ns_capable(task_user_ns(p), CAP_SYS_NICE))
goto out_unlock;

retval = security_task_setscheduler(p);
Expand Down

0 comments on commit f1c84da

Please sign in to comment.