aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/audit.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/audit.c')
-rw-r--r--kernel/audit.c36
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: