mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-10-29 05:40:23 -04:00
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.
This commit is contained in:
parent
2f7eb35f37
commit
adb16f9ff4
2 changed files with 25 additions and 13 deletions
|
|
@ -591,7 +591,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
|
||||
|
|
|
|||
|
|
@ -30,7 +30,6 @@
|
|||
#include <pulsecore/macro.h>
|
||||
|
||||
#include <xcb/xproto.h>
|
||||
#include <xcb/xcb_atom.h>
|
||||
|
||||
#define PA_XCB_FORMAT 8
|
||||
|
||||
|
|
@ -49,7 +48,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);
|
||||
|
|
@ -57,26 +55,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);
|
||||
reply = xcb_intern_atom_reply(xcb,
|
||||
xcb_intern_atom(xcb, 0, strlen(name), name),
|
||||
NULL);
|
||||
|
||||
xcb_delete_property(xcb, xs->root, reply->atom);
|
||||
if (reply) {
|
||||
xcb_delete_property(xcb, xs->root, reply->atom);
|
||||
free(reply);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -86,7 +94,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);
|
||||
|
|
@ -105,10 +112,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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue