]> Git Repo - linux.git/blobdiff - kernel/audit.c
treewide: Remove uninitialized_var() usage
[linux.git] / kernel / audit.c
index 87f31bf1f0a0c80304a6ff82cc4207aee1194ca7..ec38479f9228efbbed034330b7a5219c0e5f6785 100644 (file)
@@ -880,7 +880,7 @@ main_queue:
        return 0;
 }
 
-int audit_send_list(void *_dest)
+int audit_send_list_thread(void *_dest)
 {
        struct audit_netlink_list *dest = _dest;
        struct sk_buff *skb;
@@ -924,19 +924,30 @@ out_kfree_skb:
        return NULL;
 }
 
+static void audit_free_reply(struct audit_reply *reply)
+{
+       if (!reply)
+               return;
+
+       if (reply->skb)
+               kfree_skb(reply->skb);
+       if (reply->net)
+               put_net(reply->net);
+       kfree(reply);
+}
+
 static int audit_send_reply_thread(void *arg)
 {
        struct audit_reply *reply = (struct audit_reply *)arg;
-       struct sock *sk = audit_get_sk(reply->net);
 
        audit_ctl_lock();
        audit_ctl_unlock();
 
        /* Ignore failure. It'll only happen if the sender goes away,
           because our timeout is set to infinite. */
-       netlink_unicast(sk, reply->skb, reply->portid, 0);
-       put_net(reply->net);
-       kfree(reply);
+       netlink_unicast(audit_get_sk(reply->net), reply->skb, reply->portid, 0);
+       reply->skb = NULL;
+       audit_free_reply(reply);
        return 0;
 }
 
@@ -950,35 +961,32 @@ static int audit_send_reply_thread(void *arg)
  * @payload: payload data
  * @size: payload size
  *
- * Allocates an skb, builds the netlink message, and sends it to the port id.
- * No failure notifications.
+ * Allocates a skb, builds the netlink message, and sends it to the port id.
  */
 static void audit_send_reply(struct sk_buff *request_skb, int seq, int type, int done,
                             int multi, const void *payload, int size)
 {
-       struct net *net = sock_net(NETLINK_CB(request_skb).sk);
-       struct sk_buff *skb;
        struct task_struct *tsk;
-       struct audit_reply *reply = kmalloc(sizeof(struct audit_reply),
-                                           GFP_KERNEL);
+       struct audit_reply *reply;
 
+       reply = kzalloc(sizeof(*reply), GFP_KERNEL);
        if (!reply)
                return;
 
-       skb = audit_make_reply(seq, type, done, multi, payload, size);
-       if (!skb)
-               goto out;
-
-       reply->net = get_net(net);
+       reply->skb = audit_make_reply(seq, type, done, multi, payload, size);
+       if (!reply->skb)
+               goto err;
+       reply->net = get_net(sock_net(NETLINK_CB(request_skb).sk));
        reply->portid = NETLINK_CB(request_skb).portid;
-       reply->skb = skb;
 
        tsk = kthread_run(audit_send_reply_thread, reply, "audit_send_reply");
-       if (!IS_ERR(tsk))
-               return;
-       kfree_skb(skb);
-out:
-       kfree(reply);
+       if (IS_ERR(tsk))
+               goto err;
+
+       return;
+
+err:
+       audit_free_reply(reply);
 }
 
 /*
@@ -1525,20 +1533,60 @@ static void audit_receive(struct sk_buff  *skb)
        audit_ctl_unlock();
 }
 
+/* Log information about who is connecting to the audit multicast socket */
+static void audit_log_multicast(int group, const char *op, int err)
+{
+       const struct cred *cred;
+       struct tty_struct *tty;
+       char comm[sizeof(current->comm)];
+       struct audit_buffer *ab;
+
+       if (!audit_enabled)
+               return;
+
+       ab = audit_log_start(audit_context(), GFP_KERNEL, AUDIT_EVENT_LISTENER);
+       if (!ab)
+               return;
+
+       cred = current_cred();
+       tty = audit_get_tty();
+       audit_log_format(ab, "pid=%u uid=%u auid=%u tty=%s ses=%u",
+                        task_pid_nr(current),
+                        from_kuid(&init_user_ns, cred->uid),
+                        from_kuid(&init_user_ns, audit_get_loginuid(current)),
+                        tty ? tty_name(tty) : "(none)",
+                        audit_get_sessionid(current));
+       audit_put_tty(tty);
+       audit_log_task_context(ab); /* subj= */
+       audit_log_format(ab, " comm=");
+       audit_log_untrustedstring(ab, get_task_comm(comm, current));
+       audit_log_d_path_exe(ab, current->mm); /* exe= */
+       audit_log_format(ab, " nl-mcgrp=%d op=%s res=%d", group, op, !err);
+       audit_log_end(ab);
+}
+
 /* Run custom bind function on netlink socket group connect or bind requests. */
-static int audit_bind(struct net *net, int group)
+static int audit_multicast_bind(struct net *net, int group)
 {
+       int err = 0;
+
        if (!capable(CAP_AUDIT_READ))
-               return -EPERM;
+               err = -EPERM;
+       audit_log_multicast(group, "connect", err);
+       return err;
+}
 
-       return 0;
+static void audit_multicast_unbind(struct net *net, int group)
+{
+       audit_log_multicast(group, "disconnect", 0);
 }
 
 static int __net_init audit_net_init(struct net *net)
 {
        struct netlink_kernel_cfg cfg = {
                .input  = audit_receive,
-               .bind   = audit_bind,
+               .bind   = audit_multicast_bind,
+               .unbind = audit_multicast_unbind,
                .flags  = NL_CFG_F_NONROOT_RECV,
                .groups = AUDIT_NLGRP_MAX,
        };
@@ -1752,7 +1800,7 @@ struct audit_buffer *audit_log_start(struct audit_context *ctx, gfp_t gfp_mask,
 {
        struct audit_buffer *ab;
        struct timespec64 t;
-       unsigned int uninitialized_var(serial);
+       unsigned int serial;
 
        if (audit_initialized != AUDIT_INITIALIZED)
                return NULL;
This page took 0.03451 seconds and 4 git commands to generate.