diff options
Diffstat (limited to 'kernel/audit.c')
-rw-r--r-- | kernel/audit.c | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/kernel/audit.c b/kernel/audit.c index 5feed232be9d..8ccf8d5a874c 100644 --- a/kernel/audit.c +++ b/kernel/audit.c | |||
@@ -880,40 +880,40 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
880 | case AUDIT_TTY_GET: { | 880 | case AUDIT_TTY_GET: { |
881 | struct audit_tty_status s; | 881 | struct audit_tty_status s; |
882 | struct task_struct *tsk; | 882 | struct task_struct *tsk; |
883 | unsigned long flags; | ||
883 | 884 | ||
884 | read_lock(&tasklist_lock); | 885 | rcu_read_lock(); |
885 | tsk = find_task_by_vpid(pid); | 886 | tsk = find_task_by_vpid(pid); |
886 | if (!tsk) | 887 | if (tsk && lock_task_sighand(tsk, &flags)) { |
887 | err = -ESRCH; | ||
888 | else { | ||
889 | spin_lock_irq(&tsk->sighand->siglock); | ||
890 | s.enabled = tsk->signal->audit_tty != 0; | 888 | s.enabled = tsk->signal->audit_tty != 0; |
891 | spin_unlock_irq(&tsk->sighand->siglock); | 889 | unlock_task_sighand(tsk, &flags); |
892 | } | 890 | } else |
893 | read_unlock(&tasklist_lock); | 891 | err = -ESRCH; |
894 | audit_send_reply(NETLINK_CB(skb).pid, seq, AUDIT_TTY_GET, 0, 0, | 892 | rcu_read_unlock(); |
895 | &s, sizeof(s)); | 893 | |
894 | if (!err) | ||
895 | audit_send_reply(NETLINK_CB(skb).pid, seq, | ||
896 | AUDIT_TTY_GET, 0, 0, &s, sizeof(s)); | ||
896 | break; | 897 | break; |
897 | } | 898 | } |
898 | case AUDIT_TTY_SET: { | 899 | case AUDIT_TTY_SET: { |
899 | struct audit_tty_status *s; | 900 | struct audit_tty_status *s; |
900 | struct task_struct *tsk; | 901 | struct task_struct *tsk; |
902 | unsigned long flags; | ||
901 | 903 | ||
902 | if (nlh->nlmsg_len < sizeof(struct audit_tty_status)) | 904 | if (nlh->nlmsg_len < sizeof(struct audit_tty_status)) |
903 | return -EINVAL; | 905 | return -EINVAL; |
904 | s = data; | 906 | s = data; |
905 | if (s->enabled != 0 && s->enabled != 1) | 907 | if (s->enabled != 0 && s->enabled != 1) |
906 | return -EINVAL; | 908 | return -EINVAL; |
907 | read_lock(&tasklist_lock); | 909 | rcu_read_lock(); |
908 | tsk = find_task_by_vpid(pid); | 910 | tsk = find_task_by_vpid(pid); |
909 | if (!tsk) | 911 | if (tsk && lock_task_sighand(tsk, &flags)) { |
910 | err = -ESRCH; | ||
911 | else { | ||
912 | spin_lock_irq(&tsk->sighand->siglock); | ||
913 | tsk->signal->audit_tty = s->enabled != 0; | 912 | tsk->signal->audit_tty = s->enabled != 0; |
914 | spin_unlock_irq(&tsk->sighand->siglock); | 913 | unlock_task_sighand(tsk, &flags); |
915 | } | 914 | } else |
916 | read_unlock(&tasklist_lock); | 915 | err = -ESRCH; |
916 | rcu_read_unlock(); | ||
917 | break; | 917 | break; |
918 | } | 918 | } |
919 | default: | 919 | default: |