|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 2/4] tools: allow vchan XenStore paths more then 64 bytes long
пн, 1 авг. 2022 г. в 11:59, Juergen Gross <jgross@xxxxxxxx>:
>
> On 13.07.22 17:03, dmitry.semenets@xxxxxxxxx wrote:
> > From: Oleksandr Andrushchenko <oleksandr_andrushchenko@xxxxxxxx>
> >
> > Current vchan implementation, while dealing with XenStore paths,
> > allocates 64 bytes buffer on the stack which may not be enough for
> > some use-cases. Make the buffer longer to respect maximum allowed
> > XenStore path of XENSTORE_ABS_PATH_MAX.
> >
> > Signed-off-by: Oleksandr Andrushchenko <oleksandr_andrushchenko@xxxxxxxx>
> > Signed-off-by: Dmytro Semenets <dmytro_semenets@xxxxxxxx>
> > ---
> > tools/libs/vchan/init.c | 28 ++++++++++++++++++++++------
> > 1 file changed, 22 insertions(+), 6 deletions(-)
> >
> > diff --git a/tools/libs/vchan/init.c b/tools/libs/vchan/init.c
> > index 9195bd3b98..38658f30af 100644
> > --- a/tools/libs/vchan/init.c
> > +++ b/tools/libs/vchan/init.c
> > @@ -249,7 +249,7 @@ static int init_xs_srv(struct libxenvchan *ctrl, int
> > domain, const char* xs_base
> > int ret = -1;
> > struct xs_handle *xs;
> > struct xs_permissions perms[2];
> > - char buf[64];
> > + char *buf;
> > char ref[16];
> > char* domid_str = NULL;
> > xs_transaction_t xs_trans = XBT_NULL;
> > @@ -259,6 +259,12 @@ static int init_xs_srv(struct libxenvchan *ctrl, int
> > domain, const char* xs_base
> > if (!ctrl->xs_path)
> > return -1;
> >
> > + buf = malloc(XENSTORE_ABS_PATH_MAX);
> > + if (!buf) {
> > + free(ctrl);
> > + return 0;
> > + }
> > +
> > xs = xs_open(0);
> > if (!xs)
> > goto fail;
> > @@ -280,14 +286,14 @@ retry_transaction:
> > goto fail_xs_open;
> >
> > snprintf(ref, sizeof ref, "%d", ring_ref);
> > - snprintf(buf, sizeof buf, "%s/ring-ref", xs_base);
> > + snprintf(buf, XENSTORE_ABS_PATH_MAX, "%s/ring-ref", xs_base);
> > if (!xs_write(xs, xs_trans, buf, ref, strlen(ref)))
> > goto fail_xs_open;
> > if (!xs_set_permissions(xs, xs_trans, buf, perms, 2))
> > goto fail_xs_open;
> >
> > snprintf(ref, sizeof ref, "%d", ctrl->event_port);
> > - snprintf(buf, sizeof buf, "%s/event-channel", xs_base);
> > + snprintf(buf, XENSTORE_ABS_PATH_MAX, "%s/event-channel", xs_base);
> > if (!xs_write(xs, xs_trans, buf, ref, strlen(ref)))
> > goto fail_xs_open;
> > if (!xs_set_permissions(xs, xs_trans, buf, perms, 2))
> > @@ -303,6 +309,7 @@ retry_transaction:
> > free(domid_str);
> > xs_close(xs);
> > fail:
> > + free(buf);
> > return ret;
> > }
> >
> > @@ -419,13 +426,20 @@ struct libxenvchan *libxenvchan_client_init(struct
> > xentoollog_logger *logger,
> > {
> > struct libxenvchan *ctrl = malloc(sizeof(struct libxenvchan));
> > struct xs_handle *xs = NULL;
> > - char buf[64];
> > + char *buf;
> > char *ref;
> > int ring_ref;
> > unsigned int len;
> >
> > if (!ctrl)
> > return 0;
> > +
> > + buf = malloc(XENSTORE_ABS_PATH_MAX);
> > + if (!buf) {
> > + free(ctrl);
> > + return 0;
> > + }
> > +
> > ctrl->ring = NULL;
> > ctrl->event = NULL;
> > ctrl->gnttab = NULL;
> > @@ -436,8 +450,9 @@ struct libxenvchan *libxenvchan_client_init(struct
> > xentoollog_logger *logger,
> > if (!xs)
> > goto fail;
> >
> > +
> > // find xenstore entry
> > - snprintf(buf, sizeof buf, "%s/ring-ref", xs_path);
> > + snprintf(buf, XENSTORE_ABS_PATH_MAX, "%s/ring-ref", xs_path);
> > ref = xs_read(xs, 0, buf, &len);
> > if (!ref)
> > goto fail;
> > @@ -445,7 +460,7 @@ struct libxenvchan *libxenvchan_client_init(struct
> > xentoollog_logger *logger,
> > free(ref);
> > if (!ring_ref)
> > goto fail;
> > - snprintf(buf, sizeof buf, "%s/event-channel", xs_path);
> > + snprintf(buf, XENSTORE_ABS_PATH_MAX, "%s/event-channel", xs_path);
> > ref = xs_read(xs, 0, buf, &len);
> > if (!ref)
> > goto fail;
> > @@ -475,6 +490,7 @@ struct libxenvchan *libxenvchan_client_init(struct
> > xentoollog_logger *logger,
> > out:
> > if (xs)
> > xs_close(xs);
> > + free(buf);
> > return ctrl;
> > fail:
> > libxenvchan_close(ctrl);
>
> I think you are leaking buf in case of "goto fail".
No. File with patch doesn't have follows lines:
ctrl = NULL;
goto out;
}
>
>
> Juergen
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |