aboutsummaryrefslogtreecommitdiffstats
path: root/extras
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2009-12-14 09:51:07 +0000
committerKeir Fraser <keir.fraser@citrix.com>2009-12-14 09:51:07 +0000
commit453414b284599a93944cc893b11f85028c1d7f76 (patch)
tree7c104656495f75b805518c7e0fbac4aabfa9c57f /extras
parent82b68fcd0ab980313dc739d2974d2194f83f07f1 (diff)
downloadxen-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')
-rw-r--r--extras/mini-os/blkfront.c17
-rw-r--r--extras/mini-os/console/xencons_ring.c9
-rw-r--r--extras/mini-os/fbfront.c34
-rw-r--r--extras/mini-os/fs-front.c11
-rw-r--r--extras/mini-os/netfront.c17
-rw-r--r--extras/mini-os/pcifront.c14
-rw-r--r--extras/mini-os/xenbus/xenbus.c3
7 files changed, 80 insertions, 25 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);
diff --git a/extras/mini-os/console/xencons_ring.c b/extras/mini-os/console/xencons_ring.c
index ad385b43f4..6d2814e492 100644
--- a/extras/mini-os/console/xencons_ring.c
+++ b/extras/mini-os/console/xencons_ring.c
@@ -203,7 +203,7 @@ struct consfront_dev *init_consfront(char *_nodename)
char* err;
char* message=NULL;
int retry=0;
- char* msg;
+ char* msg = NULL;
char nodename[256];
char path[256];
static int consfrontends = 1;
@@ -242,6 +242,7 @@ again:
err = xenbus_transaction_start(&xbt);
if (err) {
printk("starting transaction\n");
+ free(err);
}
err = xenbus_printf(xbt, nodename, "ring-ref","%u",
@@ -278,6 +279,7 @@ again:
err = xenbus_transaction_end(xbt, 0, &retry);
+ if (err) free(err);
if (retry) {
goto again;
printk("completing transaction\n");
@@ -286,7 +288,8 @@ again:
goto done;
abort_transaction:
- xenbus_transaction_end(xbt, 1, &retry);
+ free(err);
+ err = xenbus_transaction_end(xbt, 1, &retry);
goto error;
done:
@@ -323,6 +326,8 @@ done:
return dev;
error:
+ free(msg);
+ free(err);
free_consfront(dev);
return NULL;
}
diff --git a/extras/mini-os/fbfront.c b/extras/mini-os/fbfront.c
index 0d61ec3fe6..7ab4778e67 100644
--- a/extras/mini-os/fbfront.c
+++ b/extras/mini-os/fbfront.c
@@ -71,7 +71,7 @@ struct kbdfront_dev *init_kbdfront(char *_nodename, int abs_pointer)
char* message=NULL;
struct xenkbd_page *s;
int retry=0;
- char* msg;
+ char* msg = NULL;
char* nodename = _nodename ? _nodename : "device/vkbd/0";
struct kbdfront_dev *dev;
@@ -102,6 +102,7 @@ again:
err = xenbus_transaction_start(&xbt);
if (err) {
printk("starting transaction\n");
+ free(err);
}
err = xenbus_printf(xbt, nodename, "page-ref","%u", virt_to_mfn(s));
@@ -124,11 +125,13 @@ again:
snprintf(path, sizeof(path), "%s/state", nodename);
err = xenbus_switch_state(xbt, path, XenbusStateInitialised);
- if (err)
+ if (err) {
printk("error writing initialized: %s\n", err);
-
+ free(err);
+ }
err = xenbus_transaction_end(xbt, 0, &retry);
+ if (err) free(err);
if (retry) {
goto again;
printk("completing transaction\n");
@@ -137,7 +140,8 @@ again:
goto done;
abort_transaction:
- xenbus_transaction_end(xbt, 1, &retry);
+ free(err);
+ err = xenbus_transaction_end(xbt, 1, &retry);
goto error;
done:
@@ -186,6 +190,8 @@ done:
return dev;
error:
+ free(msg);
+ free(err);
free_kbdfront(dev);
return NULL;
}
@@ -247,6 +253,7 @@ void shutdown_kbdfront(struct kbdfront_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_kbdfront: error changing state to %d: %s\n",
@@ -254,8 +261,10 @@ void shutdown_kbdfront(struct kbdfront_dev *dev)
goto close_kbdfront;
}
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_kbdfront: error changing state to %d: %s\n",
@@ -266,6 +275,7 @@ void shutdown_kbdfront(struct kbdfront_dev *dev)
//xenbus_wait_for_value(path, "2", &dev->events);
close_kbdfront:
+ if (err) free(err);
xenbus_unwatch_path_token(XBT_NIL, path, path);
snprintf(path, sizeof(path), "%s/page-ref", nodename);
@@ -446,6 +456,7 @@ again:
err = xenbus_transaction_start(&xbt);
if (err) {
printk("starting transaction\n");
+ free(err);
}
err = xenbus_printf(xbt, nodename, "page-ref","%u", virt_to_mfn(s));
@@ -478,6 +489,7 @@ again:
}
err = xenbus_transaction_end(xbt, 0, &retry);
+ if (err) free(err);
if (retry) {
goto again;
printk("completing transaction\n");
@@ -486,7 +498,8 @@ again:
goto done;
abort_transaction:
- xenbus_transaction_end(xbt, 1, &retry);
+ free(err);
+ err = xenbus_transaction_end(xbt, 1, &retry);
goto error;
done:
@@ -539,6 +552,7 @@ done:
return dev;
error:
+ free(err);
free_fbfront(dev);
return NULL;
}
@@ -627,6 +641,7 @@ void shutdown_fbfront(struct fbfront_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_fbfront: error changing state to %d: %s\n",
@@ -634,8 +649,10 @@ void shutdown_fbfront(struct fbfront_dev *dev)
goto close_fbfront;
}
state = xenbus_read_integer(path);
- if (state < XenbusStateClosed)
+ if (state < XenbusStateClosed) {
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_fbfront: error changing state to %d: %s\n",
@@ -646,6 +663,7 @@ void shutdown_fbfront(struct fbfront_dev *dev)
//xenbus_wait_for_value(path, "2", &dev->events);
close_fbfront:
+ if (err) free(err);
xenbus_unwatch_path_token(XBT_NIL, path, path);
snprintf(path, sizeof(path), "%s/page-ref", nodename);
diff --git a/extras/mini-os/fs-front.c b/extras/mini-os/fs-front.c
index 59b240440b..e959e3af2d 100644
--- a/extras/mini-os/fs-front.c
+++ b/extras/mini-os/fs-front.c
@@ -1103,6 +1103,7 @@ again:
err = xenbus_transaction_start(&xbt);
if (err) {
printk("starting transaction\n");
+ free(err);
}
err = xenbus_printf(xbt,
@@ -1140,9 +1141,10 @@ again:
}
err = xenbus_printf(xbt, nodename, "state", STATE_READY, 0xdeadbeef);
+ if (err) free(err);
-
err = xenbus_transaction_end(xbt, 0, &retry);
+ if (err) free(err);
if (retry) {
goto again;
printk("completing transaction\n");
@@ -1159,7 +1161,9 @@ again:
goto done;
abort_transaction:
- xenbus_transaction_end(xbt, 1, &retry);
+ free(err);
+ err = xenbus_transaction_end(xbt, 1, &retry);
+ if (err) free(err);
done:
@@ -1189,7 +1193,8 @@ done:
sprintf(token, "fs-front-%d", import->import_id);
/* The token will not be unique if multiple imports are inited */
xenbus_watch_path_token(XBT_NIL, r_nodename, r_nodename, &events);
- xenbus_wait_for_value(r_nodename, STATE_READY, &events);
+ err = xenbus_wait_for_value(r_nodename, STATE_READY, &events);
+ if (err) free(err);
xenbus_unwatch_path_token(XBT_NIL, r_nodename, r_nodename);
printk("Backend ready.\n");
diff --git a/extras/mini-os/netfront.c b/extras/mini-os/netfront.c
index 2e2ff9c3aa..a64fec6c9c 100644
--- a/extras/mini-os/netfront.c
+++ b/extras/mini-os/netfront.c
@@ -305,7 +305,7 @@ struct netfront_dev *init_netfront(char *_nodename, void (*thenetif_rx)(unsigned
struct netif_rx_sring *rxs;
int retry=0;
int i;
- char* msg;
+ char* msg = NULL;
char nodename[256];
char path[256];
struct netfront_dev *dev;
@@ -377,6 +377,7 @@ again:
err = xenbus_transaction_start(&xbt);
if (err) {
printk("starting transaction\n");
+ free(err);
}
err = xenbus_printf(xbt, nodename, "tx-ring-ref","%u",
@@ -413,6 +414,7 @@ again:
}
err = xenbus_transaction_end(xbt, 0, &retry);
+ if (err) free(err);
if (retry) {
goto again;
printk("completing transaction\n");
@@ -421,7 +423,8 @@ again:
goto done;
abort_transaction:
- xenbus_transaction_end(xbt, 1, &retry);
+ free(err);
+ err = xenbus_transaction_end(xbt, 1, &retry);
goto error;
done:
@@ -479,6 +482,8 @@ done:
return dev;
error:
+ free(msg);
+ free(err);
free_netfront(dev);
return NULL;
}
@@ -521,6 +526,7 @@ void shutdown_netfront(struct netfront_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_netfront: error changing state to %d: %s\n",
@@ -528,8 +534,10 @@ void shutdown_netfront(struct netfront_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_netfront: error changing state to %d: %s\n",
@@ -542,6 +550,7 @@ void shutdown_netfront(struct netfront_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/tx-ring-ref", nodename);
diff --git a/extras/mini-os/pcifront.c b/extras/mini-os/pcifront.c
index b9be949363..641eca4e9f 100644
--- a/extras/mini-os/pcifront.c
+++ b/extras/mini-os/pcifront.c
@@ -181,6 +181,7 @@ again:
err = xenbus_transaction_start(&xbt);
if (err) {
printk("starting transaction\n");
+ free(err);
}
err = xenbus_printf(xbt, nodename, "pci-op-ref","%u",
@@ -210,6 +211,7 @@ again:
}
err = xenbus_transaction_end(xbt, 0, &retry);
+ if (err) free(err);
if (retry) {
goto again;
printk("completing transaction\n");
@@ -218,7 +220,8 @@ again:
goto done;
abort_transaction:
- xenbus_transaction_end(xbt, 1, &retry);
+ free(err);
+ err = xenbus_transaction_end(xbt, 1, &retry);
goto error;
done:
@@ -268,6 +271,7 @@ done:
return dev;
error:
+ free(err);
free_pcifront(dev);
return NULL;
}
@@ -341,6 +345,7 @@ void shutdown_pcifront(struct pcifront_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_pcifront: error changing state to %d: %s\n",
@@ -348,8 +353,10 @@ void shutdown_pcifront(struct pcifront_dev *dev)
goto close_pcifront;
}
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);
+ free(err);
+ }
if ((err = xenbus_switch_state(XBT_NIL, nodename, XenbusStateInitialising)) != NULL) {
printk("shutdown_pcifront: error changing state to %d: %s\n",
@@ -362,6 +369,7 @@ void shutdown_pcifront(struct pcifront_dev *dev)
err = xenbus_wait_for_state_change(path, &state, &dev->events);
close_pcifront:
+ if (err) free(err);
xenbus_unwatch_path_token(XBT_NIL, path, path);
snprintf(path, sizeof(path), "%s/info-ref", nodename);
diff --git a/extras/mini-os/xenbus/xenbus.c b/extras/mini-os/xenbus/xenbus.c
index c4e6abd8a4..22f109fd07 100644
--- a/extras/mini-os/xenbus/xenbus.c
+++ b/extras/mini-os/xenbus/xenbus.c
@@ -135,7 +135,8 @@ char *xenbus_switch_state(xenbus_transaction_t xbt, const char* path, XenbusStat
do {
if (xbt == XBT_NIL) {
- xenbus_transaction_start(&xbt);
+ msg = xenbus_transaction_start(&xbt);
+ if (msg) goto exit;
xbt_flag = 1;
}