diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2009-12-14 09:51:07 +0000 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2009-12-14 09:51:07 +0000 |
commit | 453414b284599a93944cc893b11f85028c1d7f76 (patch) | |
tree | 7c104656495f75b805518c7e0fbac4aabfa9c57f /extras/mini-os/blkfront.c | |
parent | 82b68fcd0ab980313dc739d2974d2194f83f07f1 (diff) | |
download | xen-453414b284599a93944cc893b11f85028c1d7f76.tar.gz xen-453414b284599a93944cc893b11f85028c1d7f76.tar.bz2 xen-453414b284599a93944cc893b11f85028c1d7f76.zip |
mini-os: Fix memory leaks in blkfront, netfront, pcifront, etc.
The return value of Xenbus routines xenbus_transaction_start(),
xenbus_printf(), xenbus_transaction_end(), etc. is a pointer of error
message. This pointer should be passed to free() to release the
allocated memory when it is no longer needed.
Signed-off-by: Yu Zhiguo <yuzg@cn.fujitsu.com>
Diffstat (limited to 'extras/mini-os/blkfront.c')
-rw-r--r-- | extras/mini-os/blkfront.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/extras/mini-os/blkfront.c b/extras/mini-os/blkfront.c index 2d4f03b1a5..e06cf9f94a 100644 --- a/extras/mini-os/blkfront.c +++ b/extras/mini-os/blkfront.c @@ -93,7 +93,7 @@ struct blkfront_dev *init_blkfront(char *_nodename, struct blkfront_info *info) char* message=NULL; struct blkif_sring *s; int retry=0; - char* msg; + char* msg = NULL; char* c; char* nodename = _nodename ? _nodename : "device/vbd/768"; @@ -129,6 +129,7 @@ again: err = xenbus_transaction_start(&xbt); if (err) { printk("starting transaction\n"); + free(err); } err = xenbus_printf(xbt, nodename, "ring-ref","%u", @@ -159,6 +160,7 @@ again: err = xenbus_transaction_end(xbt, 0, &retry); + if (err) free(err); if (retry) { goto again; printk("completing transaction\n"); @@ -167,7 +169,8 @@ again: goto done; abort_transaction: - xenbus_transaction_end(xbt, 1, &retry); + free(err); + err = xenbus_transaction_end(xbt, 1, &retry); goto error; done: @@ -238,6 +241,8 @@ done: return dev; error: + free(msg); + free(err); free_blkfront(dev); return NULL; } @@ -265,6 +270,7 @@ void shutdown_blkfront(struct blkfront_dev *dev) state = xenbus_read_integer(path); while (err == NULL && state < XenbusStateClosing) err = xenbus_wait_for_state_change(path, &state, &dev->events); + if (err) free(err); if ((err = xenbus_switch_state(XBT_NIL, nodename, XenbusStateClosed)) != NULL) { printk("shutdown_blkfront: error changing state to %d: %s\n", @@ -272,8 +278,10 @@ void shutdown_blkfront(struct blkfront_dev *dev) goto close; } state = xenbus_read_integer(path); - if (state < XenbusStateClosed) - xenbus_wait_for_state_change(path, &state, &dev->events); + if (state < XenbusStateClosed) { + err = xenbus_wait_for_state_change(path, &state, &dev->events); + if (err) free(err); + } if ((err = xenbus_switch_state(XBT_NIL, nodename, XenbusStateInitialising)) != NULL) { printk("shutdown_blkfront: error changing state to %d: %s\n", @@ -286,6 +294,7 @@ void shutdown_blkfront(struct blkfront_dev *dev) err = xenbus_wait_for_state_change(path, &state, &dev->events); close: + if (err) free(err); xenbus_unwatch_path_token(XBT_NIL, path, path); snprintf(path, sizeof(path), "%s/ring-ref", nodename); |