Do the namespace translation just before pushing into the receiver's
slice, so we map to the receiver's user namespace.

Patch tested.

Signed-off-by: Djalal Harouni <tix...@opendz.org>
---
 connection.c | 37 +++++++++++++++++++++++++++++++++++++
 metadata.c   |  3 +++
 metadata.h   |  4 ++++
 3 files changed, 44 insertions(+)

diff --git a/connection.c b/connection.c
index 9250dab..283a3fc 100644
--- a/connection.c
+++ b/connection.c
@@ -10,6 +10,7 @@
  * your option) any later version.
  */
 
+#include <linux/audit.h>
 #include <linux/device.h>
 #include <linux/file.h>
 #include <linux/fs.h>
@@ -67,6 +68,9 @@ struct kdbus_conn_reply;
  * @auxgrp_item_offset:        The offset of the auxgrp item inside the slice, 
if
  *                     the user requested this metainfo in its attach flags.
  *                     0 if unused.
+ * @audit_item_offset: The offset of the audit item inside the slice, if
+ *                     the user requested this metainfo in its attach flags.
+ *                     0 if unused.
  * @uid:               The UID to patch into the final message
  * @gid:               The GID to patch into the final message
  * @pid:               The PID to patch into the final message
@@ -75,6 +79,8 @@ struct kdbus_conn_reply;
  *                     This information is translated into the user's
  *                     namespace when the message is installed.
  * @auxgroup_count:    The number of items in @auxgrps.
+ * @loginuid:          The audit login uid to patch into the final
+ *                     message
  */
 struct kdbus_conn_queue {
        struct list_head entry;
@@ -95,6 +101,7 @@ struct kdbus_conn_queue {
        int user;
        off_t creds_item_offset;
        off_t auxgrp_item_offset;
+       off_t audit_item_offset;
 
        /* to honor namespaces, we have to store the following here */
        kuid_t uid;
@@ -104,6 +111,8 @@ struct kdbus_conn_queue {
 
        kgid_t *auxgrps;
        unsigned int auxgrps_count;
+
+       kuid_t loginuid;
 };
 
 /**
@@ -676,6 +685,12 @@ static int kdbus_conn_queue_alloc(struct kdbus_conn *conn,
                                                    meta->auxgrps_item_off;
                }
 
+               if (meta->attached & KDBUS_ATTACH_AUDIT) {
+                       queue->loginuid = audit_get_loginuid(current);
+                       queue->audit_item_offset = meta_off +
+                                                  meta->audit_item_off;
+               }
+
                ret = kdbus_pool_slice_copy(queue->slice, meta_off,
                                            kmsg->meta->data,
                                            kmsg->meta->size);
@@ -983,6 +998,22 @@ static int kdbus_conn_creds_install(struct 
kdbus_conn_queue *queue)
        return ret;
 }
 
+static int kdbus_conn_audit_install(struct kdbus_conn_queue *queue)
+{
+       int ret;
+       u64 loginuid;
+       off_t off = queue->audit_item_offset +
+                   offsetof(struct kdbus_item, audit) +
+                   offsetof(struct kdbus_audit, loginuid);
+
+       loginuid = from_kuid_munged(current_user_ns(), queue->loginuid);
+
+       ret = kdbus_pool_slice_copy_user(queue->slice, off,
+                                        &loginuid, sizeof(loginuid));
+
+       return ret;
+}
+
 static int kdbus_conn_msg_install(struct kdbus_conn_queue *queue)
 {
        int *memfds = NULL;
@@ -1036,6 +1067,12 @@ static int kdbus_conn_msg_install(struct 
kdbus_conn_queue *queue)
                        goto exit_rewind_fds;
        }
 
+       if (queue->audit_item_offset) {
+               ret = kdbus_conn_audit_install(queue);
+               if (ret < 0)
+                       goto exit_rewind_fds;
+       }
+
        kfree(fds);
        kfree(memfds);
        kdbus_pool_slice_flush(queue->slice);
diff --git a/metadata.c b/metadata.c
index 934aa62..dabc614 100644
--- a/metadata.c
+++ b/metadata.c
@@ -119,6 +119,9 @@ kdbus_meta_append_item(struct kdbus_meta *meta, u64 type, 
size_t payload_size)
        case KDBUS_ITEM_AUXGROUPS:
                meta->auxgrps_item_off = meta->size;
                break;
+       case KDBUS_ITEM_AUDIT:
+               meta->audit_item_off = meta->size;
+               break;
        }
 
        meta->size += extra_size;
diff --git a/metadata.h b/metadata.h
index 1bdb537..ea77783 100644
--- a/metadata.h
+++ b/metadata.h
@@ -26,6 +26,9 @@
  * @auxgrps_item_off   The offset of the auxgroups item in the
  *                     @data buffer field, if the user requested
  *                     this metainfo. 0 if unused.
+ * @audit_item_off     The offset of the audit item in the @data
+ *                     buffer field, if the user requested this
+ *                     metainfo. 0 if unused.
  *
  * Used to collect and store connection metadata in a pre-compiled
  * buffer containing struct kdbus_item.
@@ -39,6 +42,7 @@ struct kdbus_meta {
 
        off_t creds_item_off;
        off_t auxgrps_item_off;
+       off_t audit_item_off;
 };
 
 struct kdbus_conn;
-- 
1.9.3

_______________________________________________
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel

Reply via email to