diff options
author | David Howells <dhowells@redhat.com> | 2011-06-17 06:25:59 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-06-17 12:40:48 -0400 |
commit | 879669961b11e7f40b518784863a259f735a72bf (patch) | |
tree | 9bff5392e365caf656c9dd9be38f7471c182278c /fs/exec.c | |
parent | eb96c925152fc289311e5d7e956b919e9b60ab53 (diff) |
KEYS/DNS: Fix ____call_usermodehelper() to not lose the session keyring
____call_usermodehelper() now erases any credentials set by the
subprocess_inf::init() function. The problem is that commit
17f60a7da150 ("capabilites: allow the application of capability limits
to usermode helpers") creates and commits new credentials with
prepare_kernel_cred() after the call to the init() function. This wipes
all keyrings after umh_keys_init() is called.
The best way to deal with this is to put the init() call just prior to
the commit_creds() call, and pass the cred pointer to init(). That
means that umh_keys_init() and suchlike can modify the credentials
_before_ they are published and potentially in use by the rest of the
system.
This prevents request_key() from working as it is prevented from passing
the session keyring it set up with the authorisation token to
/sbin/request-key, and so the latter can't assume the authority to
instantiate the key. This causes the in-kernel DNS resolver to fail
with ENOKEY unconditionally.
Signed-off-by: David Howells <dhowells@redhat.com>
Acked-by: Eric Paris <eparis@redhat.com>
Tested-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/exec.c')
-rw-r--r-- | fs/exec.c | 2 |
1 files changed, 1 insertions, 1 deletions
@@ -1996,7 +1996,7 @@ static void wait_for_dump_helpers(struct file *file) | |||
1996 | * is a special value that we use to trap recursive | 1996 | * is a special value that we use to trap recursive |
1997 | * core dumps | 1997 | * core dumps |
1998 | */ | 1998 | */ |
1999 | static int umh_pipe_setup(struct subprocess_info *info) | 1999 | static int umh_pipe_setup(struct subprocess_info *info, struct cred *new) |
2000 | { | 2000 | { |
2001 | struct file *rp, *wp; | 2001 | struct file *rp, *wp; |
2002 | struct fdtable *fdt; | 2002 | struct fdtable *fdt; |