|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 3/3] mini-os: fix several memory leaks related to xenbus
Juergen Gross, le jeu. 09 avril 2020 16:12:40 +0200, a ecrit:
> There are several instances of calls to xenbus functions which don't
> test for an error and in consequence are not freeing the returned
> error strings, or which are just not freeing the string after e.g.
> printing it.
>
> Fix that by either adding the needed calls of free().
>
> Coverity-ID: 1433632
> Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
Reviewed-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxx>
> ---
> blkfront.c | 4 ++--
> console/xenbus.c | 2 +-
> fbfront.c | 4 ++--
> netfront.c | 2 +-
> pcifront.c | 28 +++++++++++++---------------
> shutdown.c | 2 +-
> xenbus/xenbus.c | 2 ++
> 7 files changed, 22 insertions(+), 22 deletions(-)
>
> diff --git a/blkfront.c b/blkfront.c
> index f747216..834a978 100644
> --- a/blkfront.c
> +++ b/blkfront.c
> @@ -200,7 +200,7 @@ done:
>
> snprintf(path, sizeof(path), "%s/state", dev->backend);
>
> - xenbus_watch_path_token(XBT_NIL, path, path, &dev->events);
> + free(xenbus_watch_path_token(XBT_NIL, path, path, &dev->events));
>
> msg = NULL;
> state = xenbus_read_integer(path);
> @@ -208,7 +208,7 @@ done:
> msg = xenbus_wait_for_state_change(path, &state, &dev->events);
> if (msg != NULL || state != XenbusStateConnected) {
> printk("backend not available, state=%d\n", state);
> - xenbus_unwatch_path_token(XBT_NIL, path, path);
> + free(xenbus_unwatch_path_token(XBT_NIL, path, path));
> goto error;
> }
>
> diff --git a/console/xenbus.c b/console/xenbus.c
> index 654b469..05fc31c 100644
> --- a/console/xenbus.c
> +++ b/console/xenbus.c
> @@ -164,7 +164,7 @@ done:
> char path[strlen(dev->backend) + strlen("/state") + 1];
> snprintf(path, sizeof(path), "%s/state", dev->backend);
>
> - xenbus_watch_path_token(XBT_NIL, path, path, &dev->events);
> + free(xenbus_watch_path_token(XBT_NIL, path, path, &dev->events));
> msg = NULL;
> state = xenbus_read_integer(path);
> while (msg == NULL && state < XenbusStateConnected)
> diff --git a/fbfront.c b/fbfront.c
> index 9cc07b4..d3b3848 100644
> --- a/fbfront.c
> +++ b/fbfront.c
> @@ -163,7 +163,7 @@ done:
>
> snprintf(path, sizeof(path), "%s/state", dev->backend);
>
> - xenbus_watch_path_token(XBT_NIL, path, path, &dev->events);
> + free(xenbus_watch_path_token(XBT_NIL, path, path, &dev->events));
>
> err = NULL;
> state = xenbus_read_integer(path);
> @@ -530,7 +530,7 @@ done:
>
> snprintf(path, sizeof(path), "%s/state", dev->backend);
>
> - xenbus_watch_path_token(XBT_NIL, path, path, &dev->events);
> + free(xenbus_watch_path_token(XBT_NIL, path, path, &dev->events));
>
> err = NULL;
> state = xenbus_read_integer(path);
> diff --git a/netfront.c b/netfront.c
> index fe7bb62..66f2bbc 100644
> --- a/netfront.c
> +++ b/netfront.c
> @@ -513,7 +513,7 @@ done:
> err = xenbus_wait_for_state_change(path, &state, &dev->events);
> if (state != XenbusStateConnected) {
> printk("backend not avalable, state=%d\n", state);
> - xenbus_unwatch_path_token(XBT_NIL, path, path);
> + free(xenbus_unwatch_path_token(XBT_NIL, path, path));
> goto error;
> }
>
> diff --git a/pcifront.c b/pcifront.c
> index 0fc5b30..5642356 100644
> --- a/pcifront.c
> +++ b/pcifront.c
> @@ -70,28 +70,28 @@ void pcifront_watches(void *opaque)
>
> while (1) {
> printk("pcifront_watches: waiting for backend path to appear %s\n",
> path);
> - xenbus_watch_path_token(XBT_NIL, path, path, &events);
> + free(xenbus_watch_path_token(XBT_NIL, path, path, &events));
> while ((err = xenbus_read(XBT_NIL, path, &be_path)) != NULL) {
> free(err);
> xenbus_wait_for_watch(&events);
> }
> - xenbus_unwatch_path_token(XBT_NIL, path, path);
> + free(xenbus_unwatch_path_token(XBT_NIL, path, path));
> printk("pcifront_watches: waiting for backend to get into the right
> state %s\n", be_path);
> be_state = (char *) malloc(strlen(be_path) + 7);
> snprintf(be_state, strlen(be_path) + 7, "%s/state", be_path);
> - xenbus_watch_path_token(XBT_NIL, be_state, be_state, &events);
> + free(xenbus_watch_path_token(XBT_NIL, be_state, be_state, &events));
> while ((err = xenbus_read(XBT_NIL, be_state, &msg)) != NULL ||
> msg[0] > '4') {
> free(msg);
> free(err);
> xenbus_wait_for_watch(&events);
> }
> - xenbus_unwatch_path_token(XBT_NIL, be_state, be_state);
> + free(xenbus_unwatch_path_token(XBT_NIL, be_state, be_state));
> if (init_pcifront(NULL) == NULL) {
> free(be_state);
> free(be_path);
> continue;
> }
> - xenbus_watch_path_token(XBT_NIL, be_state, be_state, &events);
> + free(xenbus_watch_path_token(XBT_NIL, be_state, be_state, &events));
> state = XenbusStateConnected;
> printk("pcifront_watches: waiting for backend events %s\n",
> be_state);
> while ((err = xenbus_wait_for_state_change(be_state, &state,
> &events)) == NULL &&
> @@ -103,10 +103,9 @@ void pcifront_watches(void *opaque)
> if ((err = xenbus_switch_state(XBT_NIL, fe_state,
> XenbusStateReconfiguring)) != NULL) {
> printk("pcifront_watches: error changing state to %d:
> %s\n",
> XenbusStateReconfiguring, err);
> - if (!strcmp(err, "ENOENT")) {
> - xenbus_write(XBT_NIL, fe_state, "7");
> - free(err);
> - }
> + if (!strcmp(err, "ENOENT"))
> + free(xenbus_write(XBT_NIL, fe_state, "7"));
> + free(err);
> }
> } else if (state == XenbusStateReconfigured) {
> printk("pcifront_watches: writing %s %d\n", fe_state,
> XenbusStateConnected);
> @@ -114,10 +113,9 @@ void pcifront_watches(void *opaque)
> if ((err = xenbus_switch_state(XBT_NIL, fe_state,
> XenbusStateConnected)) != NULL) {
> printk("pcifront_watches: error changing state to %d:
> %s\n",
> XenbusStateConnected, err);
> - if (!strcmp(err, "ENOENT")) {
> - xenbus_write(XBT_NIL, fe_state, "4");
> - free(err);
> - }
> + if (!strcmp(err, "ENOENT"))
> + free(xenbus_write(XBT_NIL, fe_state, "4"));
> + free(err);
> }
> } else if (state == XenbusStateClosing)
> break;
> @@ -135,7 +133,7 @@ void pcifront_watches(void *opaque)
> pcidev = NULL;
> }
>
> - xenbus_unwatch_path_token(XBT_NIL, path, path);
> + free(xenbus_unwatch_path_token(XBT_NIL, path, path));
> }
>
> struct pcifront_dev *init_pcifront(char *_nodename)
> @@ -243,7 +241,7 @@ done:
> XenbusState state;
> snprintf(path, sizeof(path), "%s/state", dev->backend);
>
> - xenbus_watch_path_token(XBT_NIL, path, path, &dev->events);
> + free(xenbus_watch_path_token(XBT_NIL, path, path, &dev->events));
>
> err = NULL;
> state = xenbus_read_integer(path);
> diff --git a/shutdown.c b/shutdown.c
> index c7c92cb..4c0b13c 100644
> --- a/shutdown.c
> +++ b/shutdown.c
> @@ -71,7 +71,7 @@ static void shutdown_thread(void *p)
> char *shutdown, *err;
> unsigned int shutdown_reason;
>
> - xenbus_watch_path_token(XBT_NIL, path, token, &events);
> + free(xenbus_watch_path_token(XBT_NIL, path, token, &events));
>
> for ( ;; ) {
> xenbus_wait_for_watch(&events);
> diff --git a/xenbus/xenbus.c b/xenbus/xenbus.c
> index b12cef7..9e61930 100644
> --- a/xenbus/xenbus.c
> +++ b/xenbus/xenbus.c
> @@ -198,6 +198,8 @@ exit:
> }
> if (msg == NULL && msg2 != NULL)
> msg = msg2;
> + else
> + free(msg2);
> } while (retry);
>
> return msg;
> --
> 2.16.4
>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |