These are two fixes for long, long-standing bugs.
1. When we stop a container from the lxc_cmd stop handler, we kill its
init task, then we unfreeze the container to make sure it receives the
signal. When that unfreeze succeeds, we were immediately returning 0,
without sending a response to the invoker.
2. lxc_cmd returns the length of the field received. In the case of
an lxc_cmd_stop this is 16. But a comment claims we expect no response,
only a 0. In fact the handler does send a response, which may or may
not include an error. So don't call an error just because we got back a
response.
Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
Acked-by: Stéphane Graber <stgraber@ubuntu.com>
return -1;
}
- /* we do not expect any answer, because we wait for the connection to be
- * closed
- */
- if (ret > 0) {
- ERROR("failed to stop '%s': %s", name, strerror(-cmd.rsp.ret));
+ if (!ret) {
+ WARN("'%s' has stopped before replying with success", name);
+ return -1;
+ }
+
+ if (cmd.rsp.ret != 0) {
+ ERROR("Container %s:%s had an error stopping", lxcpath, name);
return -1;
}
* deadlock us
*/
if (cgroup_unfreeze(handler))
- return 0;
+ goto out;
ERROR("Failed to unfreeze %s:%s", handler->lxcpath, handler->name);
rsp.ret = -1;
}
+out:
return lxc_cmd_rsp_send(fd, &rsp);
}