Skip to content

Commit

Permalink
capabilities: add (back) dummy support for KEEPCAPS
Browse files Browse the repository at this point in the history
The dummy module is used by folk that run security conscious code(!?).  A
feature of such code (for example, dhclient) is that it tries to operate
with minimum privilege (dropping unneeded capabilities).  While the dummy
module doesn't restrict code execution based on capability state, the user
code expects the kernel to appear to support it.  This patch adds back
faked support for the PR_SET_KEEPCAPS etc., calls - making the kernel
behave as before 2.6.26.

For details see: http://bugzilla.kernel.org/show_bug.cgi?id=10748

Signed-off-by: Andrew G. Morgan <[email protected]>
Acked-by: Serge Hallyn <[email protected]>
Cc: James Morris <[email protected]>
Cc: Stephen Smalley <[email protected]>
Cc: Chris Wright <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
AndrewGMorgan authored and torvalds committed Jun 13, 2008
1 parent 57d3c64 commit 8cdbc2b
Showing 1 changed file with 23 additions and 1 deletion.
24 changes: 23 additions & 1 deletion security/dummy.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
#include <linux/hugetlb.h>
#include <linux/ptrace.h>
#include <linux/file.h>
#include <linux/prctl.h>
#include <linux/securebits.h>

static int dummy_ptrace (struct task_struct *parent, struct task_struct *child)
{
Expand Down Expand Up @@ -607,7 +609,27 @@ static int dummy_task_kill (struct task_struct *p, struct siginfo *info,
static int dummy_task_prctl (int option, unsigned long arg2, unsigned long arg3,
unsigned long arg4, unsigned long arg5, long *rc_p)
{
return 0;
switch (option) {
case PR_CAPBSET_READ:
*rc_p = (cap_valid(arg2) ? 1 : -EINVAL);
break;
case PR_GET_KEEPCAPS:
*rc_p = issecure(SECURE_KEEP_CAPS);
break;
case PR_SET_KEEPCAPS:
if (arg2 > 1)
*rc_p = -EINVAL;
else if (arg2)
current->securebits |= issecure_mask(SECURE_KEEP_CAPS);
else
current->securebits &=
~issecure_mask(SECURE_KEEP_CAPS);
break;
default:
return 0;
}

return 1;
}

static void dummy_task_reparent_to_init (struct task_struct *p)
Expand Down

0 comments on commit 8cdbc2b

Please sign in to comment.