[lxc-devel] [RFC 5/5] pass namespace handles to the stop hook
Serge Hallyn
serge.hallyn at ubuntu.com
Mon Sep 28 15:12:26 UTC 2015
Quoting Wolfgang Bumiller (w.bumiller at proxmox.com):
> ---
> src/lxc/start.c | 20 ++++++++++++++++++--
> 1 file changed, 18 insertions(+), 2 deletions(-)
>
> diff --git a/src/lxc/start.c b/src/lxc/start.c
> index a1eb961..7a909de 100644
> --- a/src/lxc/start.c
> +++ b/src/lxc/start.c
> @@ -486,15 +486,31 @@ out_free:
>
> void lxc_fini(const char *name, struct lxc_handler *handler)
> {
> - int i;
> + int i, rc;
> + pid_t self = getpid();
> + char **namespaces = (char**)malloc((LXC_NS_MAX+1) * sizeof(char*));
> + size_t namespace_count = 0;
>
> /* The STOPPING state is there for future cleanup code
> * which can take awhile
> */
> lxc_set_state(name, handler, STOPPING);
>
> - if (run_lxc_hooks(name, "stop", handler->conf, handler->lxcpath, NULL))
> + for (i = 0; i < LXC_NS_MAX; i++) {
> + if (handler->nsfd[i] != -1) {
> + rc = asprintf(&namespaces[namespace_count++], "%s:/proc/%d/fd/%d",
> + ns_info[i].proc_name, self, handler->nsfd[i]);
If asprintf fails, the contents of the first arg are undefined. So iiuc
the error loop below, on error, will try to first free an undefined
value. So I think the if (rc == -1) block needs to decrement namespace_count.
> + if (rc == -1) {
> + SYSERROR("failed to allocate memory");
> + break;
> + }
> + }
> + }
> + namespaces[namespace_count] = NULL;
> + if (run_lxc_hooks(name, "stop", handler->conf, handler->lxcpath, namespaces))
> ERROR("failed to run stop hooks for container '%s'.", name);
> + while (namespace_count--)
> + free(namespaces[namespace_count]);
> for (i = 0; i < LXC_NS_MAX; i++) {
> if (handler->nsfd[i] != -1) {
> close(handler->nsfd[i]);
> --
> 2.1.4
>
>
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel
More information about the lxc-devel
mailing list