aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Moore <paul@paul-moore.com>2016-11-29 16:53:26 -0500
committerPaul Moore <paul@paul-moore.com>2016-12-14 13:06:04 -0500
commit6c54e7899693dee3db67ea996e9be0e10f67920f (patch)
treeda2218357864e7fcb1e111d913e27d5b3c5f3bed
parente1d166212894d9d959a601c4802882b877bb420a (diff)
audit: handle a clean auditd shutdown with grace
When auditd stops cleanly it sets 'auditd_pid' to 0 with an AUDIT_SET message, in this case we should reset our backlog queues via the auditd_reset() function. This patch also adds a 'auditd_pid' check to the top of kauditd_send_unicast_skb() so we can fail quicker. Signed-off-by: Paul Moore <paul@paul-moore.com>
-rw-r--r--kernel/audit.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/kernel/audit.c b/kernel/audit.c
index 0572e5dcfda7..b447a6b1fdc8 100644
--- a/kernel/audit.c
+++ b/kernel/audit.c
@@ -468,6 +468,10 @@ static int kauditd_send_unicast_skb(struct sk_buff *skb)
468{ 468{
469 int rc; 469 int rc;
470 470
471 /* if we know nothing is connected, don't even try the netlink call */
472 if (!audit_pid)
473 return -ECONNREFUSED;
474
471 /* get an extra skb reference in case we fail to send */ 475 /* get an extra skb reference in case we fail to send */
472 skb_get(skb); 476 skb_get(skb);
473 rc = netlink_unicast(audit_sock, skb, audit_nlk_portid, 0); 477 rc = netlink_unicast(audit_sock, skb, audit_nlk_portid, 0);
@@ -1009,6 +1013,8 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
1009 audit_pid = new_pid; 1013 audit_pid = new_pid;
1010 audit_nlk_portid = NETLINK_CB(skb).portid; 1014 audit_nlk_portid = NETLINK_CB(skb).portid;
1011 audit_sock = skb->sk; 1015 audit_sock = skb->sk;
1016 if (!new_pid)
1017 auditd_reset();
1012 wake_up_interruptible(&kauditd_wait); 1018 wake_up_interruptible(&kauditd_wait);
1013 } 1019 }
1014 if (s.mask & AUDIT_STATUS_RATE_LIMIT) { 1020 if (s.mask & AUDIT_STATUS_RATE_LIMIT) {