[Xcb] [PATCH 1/2 v2] xcb_disconnect(): Fix leak with error connections

Julien Cristau jcristau at debian.org
Wed Feb 26 03:43:12 PST 2014


On Wed, Feb 19, 2014 at 21:33:11 +0100, Uli Schlachter wrote:

> There are two kind of error connections in XCB. First, if something goes wrong
> while the connection is being set up, _xcb_conn_ret_error() is used to return a
> static connection in an error state. If something goes wrong later,
> _xcb_conn_shutdown() is used to set c->has_error.
> 
> This is important, because the static object that _xcb_conn_ret_error() returns
> must not be freed, while the dynamically allocated objects that go through
> _xcb_conn_shutdown() must obviously be properly deallocated.
> 
> This used to work correctly, but in 769acff0da8, xcb_disconnect() was made to
> ignore all connections in an error state completely. Fix this by only ignoring
> the few static error connections that we have.
> 
> This was tested with the following hack:
> 
>     xcb_connection_t *c = xcb_connect(NULL, NULL);
>     close(xcb_get_file_descriptor(c));
>     xcb_discard_reply(c, xcb_get_input_focus(c).sequence);
>     xcb_flush(c);
>     xcb_disconnect(c);
> 
> Valgrind confirms that xcb has a memory leak before this patch that this patch
> indeed fixes.
> 
> Signed-off-by: Uli Schlachter <psychon at znc.in>
> ---
>  src/xcb_conn.c | 11 ++++++++++-
>  1 file changed, 10 insertions(+), 1 deletion(-)
> 

On Wed, Feb 19, 2014 at 21:34:04 +0100, Uli Schlachter wrote:

> Code can be simplified if the deallocation functions can always be called in
> cleanup code. So if you have some code that does several things that can go
> wrong, one of which is xcb_connect(), after this change, the xcb_connection_t*
> variable can be initialized to NULL and xcb_disconnect() can always be called on
> the connection object.
> 
> References: http://lists.freedesktop.org/archives/xcb/2013-September/008659.html
> 
> Signed-off-by: Uli Schlachter <psychon at znc.in>
> ---
>  src/xcb.h      | 2 +-
>  src/xcb_conn.c | 2 +-
>  2 files changed, 2 insertions(+), 2 deletions(-)
> 
For the series:
Reviewed-by: Julien Cristau <jcristau at debian.org>

Cheers,
Julien


More information about the Xcb mailing list