From: Andrew Cooper Date: Fri, 23 May 2014 10:32:01 +0000 (+0100) Subject: tools/xenstore: Fix memory leaks in the client X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~4930 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=42e896b257ad361137fd7629e20f2e1580c1a6cf;p=xen.git tools/xenstore: Fix memory leaks in the client Free the expanding buffer and output buffer after use. Close the xenstore handle after use. The command line client is now valgrind-clean. Signed-off-by: Andrew Cooper CC: Ian Campbell CC: Ian Jackson Acked-by: Ian Campbell --- diff --git a/tools/xenstore/xenstore_client.c b/tools/xenstore/xenstore_client.c index 0ec103f137..56b9309265 100644 --- a/tools/xenstore/xenstore_client.c +++ b/tools/xenstore/xenstore_client.c @@ -40,6 +40,7 @@ enum mode { static char *output_buf = NULL; static int output_pos = 0; +static struct expanding_buffer ebuf; static int output_size = 0; @@ -126,7 +127,6 @@ static int show_whole_path = 0; static void do_ls(struct xs_handle *h, char *path, int cur_depth, int show_perms) { - static struct expanding_buffer ebuf; char **e; char newpath[STRING_MAX], *val; int newpath_len; @@ -308,7 +308,6 @@ perform(enum mode mode, int optind, int argc, char **argv, struct xs_handle *xsh /* CANNOT BE REACHED */ errx(1, "invalid mode %d", mode); case MODE_read: { - static struct expanding_buffer ebuf; unsigned len; char *val = xs_read(xsh, xth, argv[optind], &len); if (val == NULL) { @@ -323,7 +322,6 @@ perform(enum mode mode, int optind, int argc, char **argv, struct xs_handle *xsh break; } case MODE_write: { - static struct expanding_buffer ebuf; char *val_spec = argv[optind + 1]; unsigned len; expanding_buffer_ensure(&ebuf, strlen(val_spec)+1); @@ -655,5 +653,11 @@ again: if (output_pos) printf("%s", output_buf); + free(output_buf); + free(ebuf.buf); + + if (xsh) + xs_close(xsh); + return ret; }