]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
commands: verify expected file descriptors were sent
authorChristian Brauner <christian.brauner@ubuntu.com>
Tue, 23 Feb 2021 18:31:29 +0000 (19:31 +0100)
committerChristian Brauner <christian.brauner@ubuntu.com>
Tue, 23 Feb 2021 18:39:36 +0000 (19:39 +0100)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/commands.c

index c5d4dd15123e6e37fadf01ec9b2e66cb1970d390..6df08f5ecf89c480301a09e277d6cdf7f3a76a49 100644 (file)
@@ -132,6 +132,7 @@ static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd)
        call_cleaner(put_unix_fds) struct unix_fds *fds = &(struct unix_fds){};
        struct lxc_cmd_rsp *rsp = &cmd->rsp;
        const char *reqstr = lxc_cmd_str(cmd->req.cmd);
+       int fret = 0;
        int ret;
 
        switch (cmd->req.cmd) {
@@ -158,7 +159,13 @@ static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd)
        ret = lxc_abstract_unix_recv_fds(sock, fds, rsp, sizeof(*rsp));
        if (ret < 0)
                return syserrno(ret, "Failed to receive response for command \"%s\"", reqstr);
-       TRACE("Command \"%s\" received response with %u file descriptors", reqstr, fds->fd_count_ret);
+
+       if (fds->fd_count_max == 0) {
+               TRACE("Command \"%s\" received response with %u file descriptors", reqstr, fds->fd_count_ret);
+       } else if (fds->fd_count_ret == 0) {
+               WARN("Command \"%s\" received response without expected file descriptors", reqstr);
+               fret = -EBADF;
+       }
 
        if (cmd->req.cmd == LXC_CMD_CONSOLE) {
                struct lxc_cmd_console_rsp_data *rspdata;
@@ -189,7 +196,7 @@ static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd)
                __fallthrough;
        case LXC_CMD_GET_SECCOMP_NOTIFY_FD:
                rsp->data = INT_TO_PTR(move_fd(fds->fd[0]));
-               return log_debug(ret, "Finished processing \"%s\"", reqstr);
+               return log_debug(fret ?: ret, "Finished processing \"%s\"", reqstr);
        case LXC_CMD_GET_CGROUP_CTX:
                if (rsp->datalen > sizeof(struct cgroup_ctx))
                        return syserrno_set(-EINVAL, "Invalid response size from server for \"%s\"", reqstr);
@@ -202,7 +209,7 @@ static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd)
        }
 
        if (rsp->datalen == 0)
-               return log_debug(ret, "Response data length for command \"%s\" is 0", reqstr);
+               return log_debug(fret ?: ret, "Response data length for command \"%s\" is 0", reqstr);
 
        if ((rsp->datalen > LXC_CMD_DATA_MAX) &&
            (cmd->req.cmd != LXC_CMD_CONSOLE_LOG))
@@ -226,7 +233,7 @@ static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd)
                        return syserrno(ret, "Failed to transfer file descriptors for \"%s\"", reqstr);
        }
 
-       return ret;
+       return fret ?: ret;
 }
 
 /*