summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPauli Nieminen <ext-pauli.nieminen@nokia.com>2010-06-11 16:30:47 +0300
committerPeter Harris <pharris@opentext.com>2010-06-15 13:16:45 -0400
commitde3cdad87a341c238c544425f4dd574b19c58ae3 (patch)
treeea53affebadedecc3fa4e304a273fdb8a617d0f7
parent18718d483e0982c779a61c71176fb0e64f850015 (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.c27
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;
}