[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] mini-os: fix various memory leaks in {fb, kbd}front
commit 00f502ebfebd60eb24452c5ae1c467f559157e94 Author: Matthew Daley <mattjd@xxxxxxxxx> AuthorDate: Wed Sep 18 15:37:59 2013 +1200 Commit: Ian Campbell <ian.campbell@xxxxxxxxxx> CommitDate: Sat Sep 21 16:42:07 2013 +0100 mini-os: fix various memory leaks in {fb, kbd}front Coverity-ID: 1055819-1055826 Signed-off-by: Matthew Daley <mattjd@xxxxxxxxx> Acked-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxx> --- extras/mini-os/fbfront.c | 48 +++++++++++++++++++++++++++++---------------- 1 files changed, 31 insertions(+), 17 deletions(-) diff --git a/extras/mini-os/fbfront.c b/extras/mini-os/fbfront.c index 3d0b8f5..a276193 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); -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |