Commit 13530116 by Serge Hallyn Committed by Stéphane Graber

commands: handle epipe

If we start a lxc_wait on a container while it is exiting, it is possible that we open the command socket, then the command socket monitor closes all its mainloop sockets and exit, then we send our credentials. Then we get killed by SIGPIPE. Handle that case, recognizing that if we get sigpipe then the container is (now) stopped. Signed-off-by: 's avatarSerge Hallyn <serge.hallyn@ubuntu.com> Acked-by: 's avatarStéphane Graber <stgraber@ubuntu.com>
parent eae105f1
...@@ -158,7 +158,7 @@ int lxc_abstract_unix_send_fd(int fd, int sendfd, void *data, size_t size) ...@@ -158,7 +158,7 @@ int lxc_abstract_unix_send_fd(int fd, int sendfd, void *data, size_t size)
msg.msg_iov = &iov; msg.msg_iov = &iov;
msg.msg_iovlen = 1; msg.msg_iovlen = 1;
return sendmsg(fd, &msg, 0); return sendmsg(fd, &msg, MSG_NOSIGNAL);
} }
int lxc_abstract_unix_recv_fd(int fd, int *recvfd, void *data, size_t size) int lxc_abstract_unix_recv_fd(int fd, int *recvfd, void *data, size_t size)
...@@ -230,7 +230,7 @@ int lxc_abstract_unix_send_credential(int fd, void *data, size_t size) ...@@ -230,7 +230,7 @@ int lxc_abstract_unix_send_credential(int fd, void *data, size_t size)
msg.msg_iov = &iov; msg.msg_iov = &iov;
msg.msg_iovlen = 1; msg.msg_iovlen = 1;
return sendmsg(fd, &msg, 0); return sendmsg(fd, &msg, MSG_NOSIGNAL);
} }
int lxc_abstract_unix_rcv_credential(int fd, void *data, size_t size) int lxc_abstract_unix_rcv_credential(int fd, void *data, size_t size)
......
...@@ -263,6 +263,8 @@ static int lxc_cmd(const char *name, struct lxc_cmd_rr *cmd, int *stopped, ...@@ -263,6 +263,8 @@ static int lxc_cmd(const char *name, struct lxc_cmd_rr *cmd, int *stopped,
ret = lxc_abstract_unix_send_credential(sock, &cmd->req, sizeof(cmd->req)); ret = lxc_abstract_unix_send_credential(sock, &cmd->req, sizeof(cmd->req));
if (ret != sizeof(cmd->req)) { if (ret != sizeof(cmd->req)) {
if (errno == EPIPE)
goto epipe;
SYSERROR("command %s failed to send req to '@%s' %d", SYSERROR("command %s failed to send req to '@%s' %d",
lxc_cmd_str(cmd->req.cmd), offset, ret); lxc_cmd_str(cmd->req.cmd), offset, ret);
if (ret >=0) if (ret >=0)
...@@ -271,8 +273,10 @@ static int lxc_cmd(const char *name, struct lxc_cmd_rr *cmd, int *stopped, ...@@ -271,8 +273,10 @@ static int lxc_cmd(const char *name, struct lxc_cmd_rr *cmd, int *stopped,
} }
if (cmd->req.datalen > 0) { if (cmd->req.datalen > 0) {
ret = send(sock, cmd->req.data, cmd->req.datalen, 0); ret = send(sock, cmd->req.data, cmd->req.datalen, MSG_NOSIGNAL);
if (ret != cmd->req.datalen) { if (ret != cmd->req.datalen) {
if (errno == EPIPE)
goto epipe;
SYSERROR("command %s failed to send request data to '@%s' %d", SYSERROR("command %s failed to send request data to '@%s' %d",
lxc_cmd_str(cmd->req.cmd), offset, ret); lxc_cmd_str(cmd->req.cmd), offset, ret);
if (ret >=0) if (ret >=0)
...@@ -289,6 +293,11 @@ out: ...@@ -289,6 +293,11 @@ out:
cmd->rsp.ret = sock; cmd->rsp.ret = sock;
return ret; return ret;
epipe:
close(sock);
*stopped = 1;
return 0;
} }
int lxc_try_cmd(const char *name, const char *lxcpath) int lxc_try_cmd(const char *name, const char *lxcpath)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment