The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxc/pull/3508

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
which allows to retrieve an active seccomp notifier fd from a running
container.

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
From 2140576960c1cfc95db5724553b360f0b4daa247 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Thu, 6 Aug 2020 14:38:07 +0200
Subject: [PATCH] seccomp: add seccomp_notify_fd_active api extension

which allows to retrieve an active seccomp notifier fd from a running
container.

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 doc/api-extensions.md    |  4 ++++
 src/lxc/api_extensions.h |  1 +
 src/lxc/commands.c       | 52 ++++++++++++++++++++++++++++++++++++++++
 src/lxc/commands.h       |  2 ++
 src/lxc/lxccontainer.c   | 11 +++++++++
 src/lxc/lxccontainer.h   |  9 +++++++
 6 files changed, 79 insertions(+)

diff --git a/doc/api-extensions.md b/doc/api-extensions.md
index 21cb55d111..9a716e48ac 100644
--- a/doc/api-extensions.md
+++ b/doc/api-extensions.md
@@ -136,3 +136,7 @@ This adds the ability to use "denylist" and "allowlist" in 
seccomp v2 policies.
 
 This adds the ability to allocate a file descriptor for the devpts instance of
 the container.
+
+## seccomp\_notify\_fd\_active
+
+Retrieve the seccomp notifier fd from a running container.
diff --git a/src/lxc/api_extensions.h b/src/lxc/api_extensions.h
index 4d97504887..1b40e5d452 100644
--- a/src/lxc/api_extensions.h
+++ b/src/lxc/api_extensions.h
@@ -44,6 +44,7 @@ static char *api_extensions[] = {
        "time_namespace",
        "seccomp_allow_deny_syntax",
        "devpts_fd",
+       "seccomp_notify_fd_active",
 };
 
 static size_t nr_api_extensions = sizeof(api_extensions) / 
sizeof(*api_extensions);
diff --git a/src/lxc/commands.c b/src/lxc/commands.c
index 22fbb04bb4..4ed84c3a02 100644
--- a/src/lxc/commands.c
+++ b/src/lxc/commands.c
@@ -87,6 +87,7 @@ static const char *lxc_cmd_str(lxc_cmd_t cmd)
                [LXC_CMD_GET_LIMITING_CGROUP]           = "get_limiting_cgroup",
                [LXC_CMD_GET_LIMITING_CGROUP2_FD]       = 
"get_limiting_cgroup2_fd",
                [LXC_CMD_GET_DEVPTS_FD]                 = "get_devpts_fd",
+               [LXC_CMD_GET_SECCOMP_NOTIFY_FD]         = 
"get_seccomp_notify_fd",
        };
 
        if (cmd >= LXC_CMD_MAX)
@@ -162,6 +163,11 @@ static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr 
*cmd)
                rsp->data = INT_TO_PTR(devpts_fd);
        }
 
+       if (cmd->req.cmd == LXC_CMD_GET_SECCOMP_NOTIFY_FD) {
+               int seccomp_notify_fd = move_fd(fd_rsp);
+               rsp->data = INT_TO_PTR(seccomp_notify_fd);
+       }
+
        if (rsp->datalen == 0)
                return log_debug(ret,
                                 "Response data length for command \"%s\" is 0",
@@ -490,6 +496,51 @@ static int lxc_cmd_get_devpts_fd_callback(int fd, struct 
lxc_cmd_req *req,
        return 0;
 }
 
+int lxc_cmd_get_seccomp_notify_fd(const char *name, const char *lxcpath)
+{
+#if HAVE_DECL_SECCOMP_NOTIFY_FD
+       int ret, stopped;
+       struct lxc_cmd_rr cmd = {
+               .req = {
+                       .cmd = LXC_CMD_GET_SECCOMP_NOTIFY_FD,
+               },
+       };
+
+       ret = lxc_cmd(name, &cmd, &stopped, lxcpath, NULL);
+       if (ret < 0)
+               return log_debug_errno(-1, errno, "Failed to process seccomp 
notify fd command");
+
+       if (cmd.rsp.ret < 0)
+               return log_debug_errno(-EBADF, errno, "Failed to receive 
seccomp notify fd");
+
+       return PTR_TO_INT(cmd.rsp.data);
+#else
+       return ret_errno(EOPNOTSUPP);
+#endif
+}
+
+static int lxc_cmd_get_seccomp_notify_fd_callback(int fd, struct lxc_cmd_req 
*req,
+                                                 struct lxc_handler *handler,
+                                                 struct lxc_epoll_descr *descr)
+{
+#if HAVE_DECL_SECCOMP_NOTIFY_FD
+       struct lxc_cmd_rsp rsp = {
+               .ret = 0,
+       };
+       int ret;
+
+       if (!handler->conf || handler->conf->seccomp.notifier.notify_fd < 0)
+               rsp.ret = -EBADF;
+       ret = lxc_abstract_unix_send_fds(fd, 
&handler->conf->seccomp.notifier.notify_fd, 1, &rsp, sizeof(rsp));
+       if (ret < 0)
+               return log_error(LXC_CMD_REAP_CLIENT_FD, "Failed to send 
seccomp notify fd");
+
+       return 0;
+#else
+       return ret_errno(EOPNOTSUPP);
+#endif
+}
+
 /*
  * lxc_cmd_get_clone_flags: Get clone flags container was spawned with
  *
@@ -1549,6 +1600,7 @@ static int lxc_cmd_process(int fd, struct lxc_cmd_req 
*req,
                [LXC_CMD_GET_LIMITING_CGROUP]           = 
lxc_cmd_get_limiting_cgroup_callback,
                [LXC_CMD_GET_LIMITING_CGROUP2_FD]       = 
lxc_cmd_get_limiting_cgroup2_fd_callback,
                [LXC_CMD_GET_DEVPTS_FD]                 = 
lxc_cmd_get_devpts_fd_callback,
+               [LXC_CMD_GET_SECCOMP_NOTIFY_FD]         = 
lxc_cmd_get_seccomp_notify_fd_callback,
        };
 
        if (req->cmd >= LXC_CMD_MAX)
diff --git a/src/lxc/commands.h b/src/lxc/commands.h
index ef545e23ae..c87dad4e90 100644
--- a/src/lxc/commands.h
+++ b/src/lxc/commands.h
@@ -42,6 +42,7 @@ typedef enum {
        LXC_CMD_GET_LIMITING_CGROUP,
        LXC_CMD_GET_LIMITING_CGROUP2_FD,
        LXC_CMD_GET_DEVPTS_FD,
+       LXC_CMD_GET_SECCOMP_NOTIFY_FD,
        LXC_CMD_MAX,
 } lxc_cmd_t;
 
@@ -120,6 +121,7 @@ __hidden extern int lxc_cmd_mainloop_add(const char *name, 
struct lxc_epoll_desc
 __hidden extern int lxc_try_cmd(const char *name, const char *lxcpath);
 __hidden extern int lxc_cmd_console_log(const char *name, const char *lxcpath,
                                        struct lxc_console_log *log);
+__hidden extern int lxc_cmd_get_seccomp_notify_fd(const char *name, const char 
*lxcpath);
 __hidden extern int lxc_cmd_seccomp_notify_add_listener(const char *name, 
const char *lxcpath, int fd,
                                                        /* unused */ unsigned 
int command,
                                                        /* unused */ unsigned 
int flags);
diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
index 8d854aaf13..673cf2483d 100644
--- a/src/lxc/lxccontainer.c
+++ b/src/lxc/lxccontainer.c
@@ -5240,6 +5240,16 @@ static int do_lxcapi_seccomp_notify_fd(struct 
lxc_container *c)
 
 WRAP_API(int, lxcapi_seccomp_notify_fd)
 
+static int do_lxcapi_seccomp_notify_fd_active(struct lxc_container *c)
+{
+       if (!c || !c->lxc_conf)
+               return ret_set_errno(-1, -EINVAL);
+
+       return lxc_cmd_get_seccomp_notify_fd(c->name, c->config_path);
+}
+
+WRAP_API(int, lxcapi_seccomp_notify_fd_active)
+
 struct lxc_container *lxc_container_new(const char *name, const char 
*configpath)
 {
        struct lxc_container *c;
@@ -5382,6 +5392,7 @@ struct lxc_container *lxc_container_new(const char *name, 
const char *configpath
        c->mount = lxcapi_mount;
        c->umount = lxcapi_umount;
        c->seccomp_notify_fd = lxcapi_seccomp_notify_fd;
+       c->seccomp_notify_fd_active = lxcapi_seccomp_notify_fd_active;
 
        return c;
 
diff --git a/src/lxc/lxccontainer.h b/src/lxc/lxccontainer.h
index 3437550d7e..1229a1f349 100644
--- a/src/lxc/lxccontainer.h
+++ b/src/lxc/lxccontainer.h
@@ -857,6 +857,15 @@ struct lxc_container {
         */
        int (*seccomp_notify_fd)(struct lxc_container *c);
 
+       /*!
+        * \brief Retrieve a file descriptor for the running container's 
seccomp filter.
+        *
+        * \param c Container
+        *
+        * \return file descriptor for the running container's seccomp filter
+        */
+       int (*seccomp_notify_fd_active)(struct lxc_container *c);
+
        /*!
         * \brief Retrieve a pidfd for the container's init process.
         *
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to