diff options
author | Pauli Nieminen <ext-pauli.nieminen@nokia.com> | 2010-06-11 16:30:47 +0300 |
---|---|---|
committer | Peter Harris <pharris@opentext.com> | 2010-06-15 13:16:45 -0400 |
commit | de3cdad87a341c238c544425f4dd574b19c58ae3 (patch) | |
tree | ea53affebadedecc3fa4e304a273fdb8a617d0f7 | |
parent | 18718d483e0982c779a61c71176fb0e64f850015 (diff) |
xcb_connect_to_display_with_auth_info: Fix memory leak
protocol and host are allocated in _xcb_parse_display but ownership of
them is passed to the caller. They have to be freed in
xcb_connect_to_display_with_auth_info.
Signed-off-by: Pauli Nieminen <ext-pauli.nieminen@nokia.com>
Signed-off-by: Peter Harris <pharris@opentext.com>
-rw-r--r-- | src/xcb_util.c | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/src/xcb_util.c b/src/xcb_util.c index fe1f99f..5a82ac1 100644 --- a/src/xcb_util.c +++ b/src/xcb_util.c @@ -398,24 +398,28 @@ xcb_connection_t *xcb_connect(const char *displayname, int *screenp) xcb_connection_t *xcb_connect_to_display_with_auth_info(const char *displayname, xcb_auth_info_t *auth, int *screenp) { int fd, display = 0; - char *host; - char *protocol; + char *host = NULL; + char *protocol = NULL; xcb_auth_info_t ourauth; xcb_connection_t *c; int parsed = _xcb_parse_display(displayname, &host, &protocol, &display, screenp); - if(!parsed) - return (xcb_connection_t *) &error_connection; - else + if(!parsed) { + c = (xcb_connection_t *) &error_connection; + goto out; + } else fd = _xcb_open(host, protocol, display); - free(host); - if(fd == -1) - return (xcb_connection_t *) &error_connection; + if(fd == -1) { + c = (xcb_connection_t *) &error_connection; + goto out; + } - if(auth) - return xcb_connect_to_fd(fd, auth); + if(auth) { + c = xcb_connect_to_fd(fd, auth); + goto out; + } if(_xcb_get_auth_info(fd, &ourauth, display)) { @@ -426,5 +430,8 @@ xcb_connection_t *xcb_connect_to_display_with_auth_info(const char *displayname, else c = xcb_connect_to_fd(fd, 0); +out: + free(host); + free(protocol); return c; } |