[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2] tools: remove xenstore entries on vchan server closure



On Wed, Feb 16, 2022 at 1:33 AM Oleksandr Andrushchenko
<andr2000@xxxxxxxxx> wrote:
>
> From: Oleksandr Andrushchenko <oleksandr_andrushchenko@xxxxxxxx>
>
> vchan server creates XenStore entries to advertise its event channel and
> ring, but those are not removed after the server quits.
> Add additional cleanup step, so those are removed, so clients do not try
> to connect to a non-existing server.
>
> Signed-off-by: Oleksandr Andrushchenko <oleksandr_andrushchenko@xxxxxxxx>
>
> ---
> Since v1:
> - add NULL check after strdup
> ---
>  tools/include/libxenvchan.h |  5 +++++
>  tools/libs/vchan/init.c     | 25 +++++++++++++++++++++++++
>  tools/libs/vchan/io.c       |  4 ++++
>  tools/libs/vchan/vchan.h    | 31 +++++++++++++++++++++++++++++++
>  4 files changed, 65 insertions(+)
>  create mode 100644 tools/libs/vchan/vchan.h

> diff --git a/tools/libs/vchan/init.c b/tools/libs/vchan/init.c
> index c8510e6ce98a..ae9a6b579753 100644
> --- a/tools/libs/vchan/init.c
> +++ b/tools/libs/vchan/init.c
> @@ -46,6 +46,8 @@
>  #include <xen/sys/gntdev.h>
>  #include <libxenvchan.h>
>
> +#include "vchan.h"
> +
>  #ifndef PAGE_SHIFT
>  #define PAGE_SHIFT 12
>  #endif
> @@ -251,6 +253,12 @@ static int init_xs_srv(struct libxenvchan *ctrl, int 
> domain, const char* xs_base
>         char ref[16];
>         char* domid_str = NULL;
>         xs_transaction_t xs_trans = XBT_NULL;
> +
> +       // store the base path so we can clean up on server closure
> +       ctrl->xs_path = strdup(xs_base);
> +       if (!ctrl->xs_path)
> +               goto fail;
> +
>         xs = xs_open(0);
>         if (!xs)
>                 goto fail;

Hi, Oleksandr,

You now have multiple conditions goto fail, so I think you need to add
the below snippet to avoid leaking memory.

if (ret) {
    free(ctrl->xs_path)
    ctrl->xs_path = NULL;
}

It's actually okay with your patch since libxenvchan_server_init() does:

        if (init_xs_srv(ctrl, domain, xs_path, ring_ref))
                goto out;
        return ctrl;
out:
        libxenvchan_close(ctrl);
        return 0;

and libxenvchan_close() will free xs_path.  But it's a little more
robust to cleanup local to the failure.

Thanks,
Jason



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.