aboutsummaryrefslogtreecommitdiffstats
path: root/extras
diff options
context:
space:
mode:
authorMatthew Daley <mattjd@gmail.com>2013-09-18 15:37:59 +1200
committerIan Campbell <ian.campbell@citrix.com>2013-09-21 16:42:07 +0100
commit00f502ebfebd60eb24452c5ae1c467f559157e94 (patch)
tree697d69e8aada61d66bccac7866ba16b2c7a9a45e /extras
parent74ca2b137585eba5e5a64a301d3628a07460a28f (diff)
downloadxen-00f502ebfebd60eb24452c5ae1c467f559157e94.tar.gz
xen-00f502ebfebd60eb24452c5ae1c467f559157e94.tar.bz2
xen-00f502ebfebd60eb24452c5ae1c467f559157e94.zip
mini-os: fix various memory leaks in {fb, kbd}front
Coverity-ID: 1055819-1055826 Signed-off-by: Matthew Daley <mattjd@gmail.com> Acked-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Diffstat (limited to 'extras')
-rw-r--r--extras/mini-os/fbfront.c48
1 files changed, 31 insertions, 17 deletions
diff --git a/extras/mini-os/fbfront.c b/extras/mini-os/fbfront.c
index 3d0b8f5865..a276193485 100644
--- a/extras/mini-os/fbfront.c
+++ b/extras/mini-os/fbfront.c
@@ -171,7 +171,8 @@ done:
err = xenbus_wait_for_state_change(path, &state, &dev->events);
if (state != XenbusStateConnected) {
printk("backend not available, state=%d\n", state);
- xenbus_unwatch_path_token(XBT_NIL, path, path);
+ if (err) free(err);
+ err = xenbus_unwatch_path_token(XBT_NIL, path, path);
goto error;
}
@@ -181,7 +182,8 @@ done:
if((err = xenbus_switch_state(XBT_NIL, frontpath, XenbusStateConnected))
!= NULL) {
printk("error switching state: %s\n", err);
- xenbus_unwatch_path_token(XBT_NIL, path, path);
+ free(err);
+ err = xenbus_unwatch_path_token(XBT_NIL, path, path);
goto error;
}
}
@@ -236,7 +238,7 @@ int kbdfront_receive(struct kbdfront_dev *dev, union xenkbd_in_event *buf, int n
void shutdown_kbdfront(struct kbdfront_dev *dev)
{
- char* err = NULL;
+ char* err = NULL, *err2;
XenbusState state;
char path[strlen(dev->backend) + strlen("/state") + 1];
@@ -278,14 +280,18 @@ void shutdown_kbdfront(struct kbdfront_dev *dev)
close_kbdfront:
if (err) free(err);
- xenbus_unwatch_path_token(XBT_NIL, path, path);
+ err2 = xenbus_unwatch_path_token(XBT_NIL, path, path);
+ if (err2) free(err2);
snprintf(nodename, sizeof(nodename), "%s/page-ref", dev->nodename);
- xenbus_rm(XBT_NIL, nodename);
+ err2 = xenbus_rm(XBT_NIL, nodename);
+ if (err2) free(err2);
snprintf(nodename, sizeof(nodename), "%s/event-channel", dev->nodename);
- xenbus_rm(XBT_NIL, nodename);
+ err2 = xenbus_rm(XBT_NIL, nodename);
+ if (err2) free(err2);
snprintf(nodename, sizeof(nodename), "%s/request-abs-pointer", dev->nodename);
- xenbus_rm(XBT_NIL, nodename);
+ err2 = xenbus_rm(XBT_NIL, nodename);
+ if (err2) free(err2);
if (!err)
free_kbdfront(dev);
@@ -405,7 +411,7 @@ struct fbfront_dev *init_fbfront(char *_nodename, unsigned long *mfns, int width
char* message=NULL;
struct xenfb_page *s;
int retry=0;
- char* msg;
+ char* msg=NULL;
int i, j;
struct fbfront_dev *dev;
int max_pd;
@@ -532,7 +538,8 @@ done:
err = xenbus_wait_for_state_change(path, &state, &dev->events);
if (state != XenbusStateConnected) {
printk("backend not available, state=%d\n", state);
- xenbus_unwatch_path_token(XBT_NIL, path, path);
+ if (err) free(err);
+ err = xenbus_unwatch_path_token(XBT_NIL, path, path);
goto error;
}
@@ -545,7 +552,8 @@ done:
if ((err = xenbus_switch_state(XBT_NIL, frontpath, XenbusStateConnected))
!= NULL) {
printk("error switching state: %s\n", err);
- xenbus_unwatch_path_token(XBT_NIL, path, path);
+ free(err);
+ err = xenbus_unwatch_path_token(XBT_NIL, path, path);
goto error;
}
}
@@ -556,6 +564,7 @@ done:
return dev;
error:
+ free(msg);
free(err);
free_fbfront(dev);
return NULL;
@@ -627,7 +636,7 @@ void fbfront_resize(struct fbfront_dev *dev, int width, int height, int stride,
void shutdown_fbfront(struct fbfront_dev *dev)
{
- char* err = NULL;
+ char* err = NULL, *err2;
XenbusState state;
char path[strlen(dev->backend) + strlen("/state") + 1];
@@ -654,7 +663,7 @@ void shutdown_fbfront(struct fbfront_dev *dev)
}
state = xenbus_read_integer(path);
if (state < XenbusStateClosed) {
- xenbus_wait_for_state_change(path, &state, &dev->events);
+ err = xenbus_wait_for_state_change(path, &state, &dev->events);
if (err) free(err);
}
@@ -669,16 +678,21 @@ void shutdown_fbfront(struct fbfront_dev *dev)
close_fbfront:
if (err) free(err);
- xenbus_unwatch_path_token(XBT_NIL, path, path);
+ err2 = xenbus_unwatch_path_token(XBT_NIL, path, path);
+ if (err2) free(err2);
snprintf(nodename, sizeof(nodename), "%s/page-ref", dev->nodename);
- xenbus_rm(XBT_NIL, nodename);
+ err2 = xenbus_rm(XBT_NIL, nodename);
+ if (err2) free(err2);
snprintf(nodename, sizeof(nodename), "%s/event-channel", dev->nodename);
- xenbus_rm(XBT_NIL, nodename);
+ err2 = xenbus_rm(XBT_NIL, nodename);
+ if (err2) free(err2);
snprintf(nodename, sizeof(nodename), "%s/protocol", dev->nodename);
- xenbus_rm(XBT_NIL, nodename);
+ err2 = xenbus_rm(XBT_NIL, nodename);
+ if (err2) free(err2);
snprintf(nodename, sizeof(nodename), "%s/feature-update", dev->nodename);
- xenbus_rm(XBT_NIL, nodename);
+ err2 = xenbus_rm(XBT_NIL, nodename);
+ if (err2) free(err2);
if (!err)
free_fbfront(dev);