diff options
author | David Howells <dhowells@redhat.com> | 2008-11-13 18:39:19 -0500 |
---|---|---|
committer | James Morris <jmorris@namei.org> | 2008-11-13 18:39:19 -0500 |
commit | c69e8d9c01db2adc503464993c358901c9af9de4 (patch) | |
tree | bed94aaa9aeb7a7834d1c880f72b62a11a752c78 /fs/fcntl.c | |
parent | 86a264abe542cfececb4df129bc45a0338d8cdb9 (diff) |
CRED: Use RCU to access another task's creds and to release a task's own creds
Use RCU to access another task's creds and to release a task's own creds.
This means that it will be possible for the credentials of a task to be
replaced without another task (a) requiring a full lock to read them, and (b)
seeing deallocated memory.
Signed-off-by: David Howells <dhowells@redhat.com>
Acked-by: James Morris <jmorris@namei.org>
Acked-by: Serge Hallyn <serue@us.ibm.com>
Signed-off-by: James Morris <jmorris@namei.org>
Diffstat (limited to 'fs/fcntl.c')
-rw-r--r-- | fs/fcntl.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/fs/fcntl.c b/fs/fcntl.c index c594cc0e40fb..87c39f1f0817 100644 --- a/fs/fcntl.c +++ b/fs/fcntl.c | |||
@@ -401,10 +401,17 @@ static const long band_table[NSIGPOLL] = { | |||
401 | static inline int sigio_perm(struct task_struct *p, | 401 | static inline int sigio_perm(struct task_struct *p, |
402 | struct fown_struct *fown, int sig) | 402 | struct fown_struct *fown, int sig) |
403 | { | 403 | { |
404 | return (((fown->euid == 0) || | 404 | const struct cred *cred; |
405 | (fown->euid == p->cred->suid) || (fown->euid == p->cred->uid) || | 405 | int ret; |
406 | (fown->uid == p->cred->suid) || (fown->uid == p->cred->uid)) && | 406 | |
407 | !security_file_send_sigiotask(p, fown, sig)); | 407 | rcu_read_lock(); |
408 | cred = __task_cred(p); | ||
409 | ret = ((fown->euid == 0 || | ||
410 | fown->euid == cred->suid || fown->euid == cred->uid || | ||
411 | fown->uid == cred->suid || fown->uid == cred->uid) && | ||
412 | !security_file_send_sigiotask(p, fown, sig)); | ||
413 | rcu_read_unlock(); | ||
414 | return ret; | ||
408 | } | 415 | } |
409 | 416 | ||
410 | static void send_sigio_to_task(struct task_struct *p, | 417 | static void send_sigio_to_task(struct task_struct *p, |