diff options
| author | Arnaud Fontaine <arnau@debian.org> | 2011-03-29 22:56:28 +0159 | 
|---|---|---|
| committer | Colin Guthrie <colin@mageia.org> | 2011-05-07 17:01:28 +0100 | 
| commit | b72fc9b4f158bafb66a7de28ce038986d96ce850 (patch) | |
| tree | ddb709a3dc3ba2e35eeaddd156cf558c01edb503 | |
| parent | 7fd0771522240445bd7d4d1df1e6bce79119c483 (diff) | |
x11: More XCB fixes.
Commit 65ef80b fixed building with xcb-util >= 0.3.8, but the reply is never
checked (possible SIGSEGV if the reply is NULL) nor freed (memory leak at each
call of the functions).
Also, remove include and dependencies on xcb-atom, as it was only meaningful
for xcb_atom_get() and STRING, and depend instead on xcb >= 1.6 for
XCB_ATOM_STRING.
| -rw-r--r-- | configure.ac | 2 | ||||
| -rw-r--r-- | src/pulsecore/x11prop.c | 38 | 
2 files changed, 26 insertions, 14 deletions
diff --git a/configure.ac b/configure.ac index 299dd490..ed9bd172 100644 --- a/configure.ac +++ b/configure.ac @@ -547,7 +547,7 @@ AC_ARG_ENABLE([x11],          [x11=auto])  if test "x${x11}" != xno ; then -    PKG_CHECK_MODULES(X11, [ x11-xcb ice sm xtst xcb-atom ], +    PKG_CHECK_MODULES(X11, [ x11-xcb xcb >= 1.6 ice sm xtst ],          HAVE_X11=1,          [              HAVE_X11=0 diff --git a/src/pulsecore/x11prop.c b/src/pulsecore/x11prop.c index d66c48f5..8fca2195 100644 --- a/src/pulsecore/x11prop.c +++ b/src/pulsecore/x11prop.c @@ -30,7 +30,6 @@  #include <pulsecore/macro.h>  #include <xcb/xproto.h> -#include <xcb/xcb_atom.h>  #define PA_XCB_FORMAT 8 @@ -50,7 +49,6 @@ static xcb_screen_t *screen_of_display(xcb_connection_t *xcb, int screen)  void pa_x11_set_prop(xcb_connection_t *xcb, int screen, const char *name, const char *data) {      xcb_screen_t *xs; -    xcb_intern_atom_cookie_t cookie;      xcb_intern_atom_reply_t *reply;      pa_assert(xcb); @@ -58,26 +56,36 @@ void pa_x11_set_prop(xcb_connection_t *xcb, int screen, const char *name, const      pa_assert(data);      if ((xs = screen_of_display(xcb, screen))) { -        cookie = xcb_intern_atom(xcb, 0, strlen(name), name); -        reply = xcb_intern_atom_reply(xcb, cookie, NULL); +        reply = xcb_intern_atom_reply(xcb, +                                      xcb_intern_atom(xcb, 0, strlen(name), name), +                                      NULL); -        xcb_change_property(xcb, XCB_PROP_MODE_REPLACE, xs->root, reply->atom, XCB_ATOM_STRING, PA_XCB_FORMAT, (int) strlen(data), (const void*) data); +        if (reply) { +            xcb_change_property(xcb, XCB_PROP_MODE_REPLACE, xs->root, reply->atom, +                                XCB_ATOM_STRING, PA_XCB_FORMAT, +                                (int) strlen(data), (const void*) data); + +            free(reply); +        }      }  }  void pa_x11_del_prop(xcb_connection_t *xcb, int screen, const char *name) {      xcb_screen_t *xs; -    xcb_intern_atom_cookie_t cookie;      xcb_intern_atom_reply_t *reply;      pa_assert(xcb);      pa_assert(name);      if ((xs = screen_of_display(xcb, screen))) { -        cookie = xcb_intern_atom(xcb, 0, strlen(name), name); -        reply = xcb_intern_atom_reply(xcb, cookie, NULL); - -        xcb_delete_property(xcb, xs->root, reply->atom); +        reply = xcb_intern_atom_reply(xcb, +                                      xcb_intern_atom(xcb, 0, strlen(name), name), +                                      NULL); + +        if (reply) { +            xcb_delete_property(xcb, xs->root, reply->atom); +            free(reply); +        }      }  } @@ -87,7 +95,6 @@ char* pa_x11_get_prop(xcb_connection_t *xcb, int screen, const char *name, char      xcb_get_property_cookie_t req;      xcb_get_property_reply_t* prop = NULL;      xcb_screen_t *xs; -    xcb_intern_atom_cookie_t cookie;      xcb_intern_atom_reply_t *reply;      pa_assert(xcb); @@ -106,10 +113,15 @@ char* pa_x11_get_prop(xcb_connection_t *xcb, int screen, const char *name, char          xs = screen_of_display(xcb, 0);      if (xs) { -        cookie = xcb_intern_atom(xcb, 0, strlen(name), name); -        reply = xcb_intern_atom_reply(xcb, cookie, NULL); +        reply = xcb_intern_atom_reply(xcb, +                                      xcb_intern_atom(xcb, 0, strlen(name), name), +                                      NULL); + +        if (!reply) +            goto finish;          req = xcb_get_property(xcb, 0, xs->root, reply->atom, XCB_ATOM_STRING, 0, (uint32_t)(l-1)); +        free(reply);          prop = xcb_get_property_reply(xcb, req, NULL);          if (!prop)  | 
