* @KDBUS_ITEM_ID: Connection ID
* @KDBUS_ITEM_TIMESTAMP: Timestamp
* @KDBUS_ITEM_CREDS: Process credential
+ * @KDBUS_ITEM_AUXGROUPS: Auxiliary process groups
* @KDBUS_ITEM_PID_COMM: Process ID "comm" identifier
* @KDBUS_ITEM_TID_COMM: Thread ID "comm" identifier
* @KDBUS_ITEM_EXE: The path of the executable
KDBUS_ITEM_ID,
KDBUS_ITEM_TIMESTAMP,
KDBUS_ITEM_CREDS,
+ KDBUS_ITEM_AUXGROUPS,
KDBUS_ITEM_PID_COMM,
KDBUS_ITEM_TID_COMM,
KDBUS_ITEM_EXE,
* enum kdbus_attach_flags - flags for metadata attachments
* @KDBUS_ATTACH_TIMESTAMP: Timestamp
* @KDBUS_ATTACH_CREDS: Credentials
+ * @KDBUS_ATTACH_AUXGROUPS: Auxiliary groups
* @KDBUS_ATTACH_NAMES: Well-known names
* @KDBUS_ATTACH_COMM: The "comm" process identifier
* @KDBUS_ATTACH_EXE: The path of the executable
enum kdbus_attach_flags {
KDBUS_ATTACH_TIMESTAMP = 1 << 0,
KDBUS_ATTACH_CREDS = 1 << 1,
- KDBUS_ATTACH_NAMES = 1 << 2,
- KDBUS_ATTACH_COMM = 1 << 3,
- KDBUS_ATTACH_EXE = 1 << 4,
- KDBUS_ATTACH_CMDLINE = 1 << 5,
- KDBUS_ATTACH_CGROUP = 1 << 6,
- KDBUS_ATTACH_CAPS = 1 << 7,
- KDBUS_ATTACH_SECLABEL = 1 << 8,
- KDBUS_ATTACH_AUDIT = 1 << 9,
- KDBUS_ATTACH_CONN_NAME = 1 << 10,
- _KDBUS_ATTACH_ALL = (1 << 11) - 1,
+ KDBUS_ATTACH_AUXGROUPS = 1 << 2,
+ KDBUS_ATTACH_NAMES = 1 << 3,
+ KDBUS_ATTACH_COMM = 1 << 4,
+ KDBUS_ATTACH_EXE = 1 << 5,
+ KDBUS_ATTACH_CMDLINE = 1 << 6,
+ KDBUS_ATTACH_CGROUP = 1 << 7,
+ KDBUS_ATTACH_CAPS = 1 << 8,
+ KDBUS_ATTACH_SECLABEL = 1 << 9,
+ KDBUS_ATTACH_AUDIT = 1 << 10,
+ KDBUS_ATTACH_CONN_NAME = 1 << 11,
+ _KDBUS_ATTACH_ALL = (1 << 12) - 1,
};
/**
&creds, sizeof(creds));
}
+static int kdbus_meta_append_auxgroups(struct kdbus_meta *meta)
+{
+ struct group_info *info;
+ struct kdbus_item *item;
+ u64 *gid, size;
+ int i, ret = 0;
+
+ info = get_current_groups();
+
+ size = KDBUS_ITEM_SIZE(info->ngroups * sizeof(*gid));
+ item = kdbus_meta_append_item(meta, size);
+ if (IS_ERR(item)) {
+ ret = PTR_ERR(item);
+ goto exit_put_groups;
+ }
+
+ item->size = size;
+ item->type = KDBUS_ITEM_AUXGROUPS;
+ gid = (u64 *) item->data;
+
+ for (i = 0; i < info->ngroups; i++)
+ gid[i] = from_kgid(current_user_ns(), GROUP_AT(info, i));
+
+exit_put_groups:
+ put_group_info(info);
+
+ return ret;
+}
+
static int kdbus_meta_append_src_names(struct kdbus_meta *meta,
struct kdbus_conn *conn)
{
return ret;
}
+ if (mask & KDBUS_ATTACH_AUXGROUPS) {
+ ret = kdbus_meta_append_auxgroups(meta);
+ if (ret < 0)
+ return ret;
+ }
+
if (mask & KDBUS_ATTACH_NAMES && conn) {
ret = kdbus_meta_append_src_names(meta, conn);
if (ret < 0)