Rewrite code which query xinerama screens to fix a double free
This commit is contained in:
parent
3ea19aab12
commit
df3e102832
|
@ -69,33 +69,11 @@ screensinfo_delete(ScreensInfo **si)
|
||||||
p_delete(si);
|
p_delete(si);
|
||||||
}
|
}
|
||||||
|
|
||||||
static xcb_xinerama_screen_info_t *
|
|
||||||
xinerama_query_screens(xcb_connection_t *c, int *screen_number)
|
|
||||||
{
|
|
||||||
xcb_xinerama_query_screens_reply_t *reply;
|
|
||||||
xcb_xinerama_screen_info_t *si;
|
|
||||||
|
|
||||||
reply = xcb_xinerama_query_screens_reply(c,
|
|
||||||
xcb_xinerama_query_screens_unchecked(c),
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
if(!reply)
|
|
||||||
{
|
|
||||||
*screen_number = 0;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
*screen_number = xcb_xinerama_query_screens_screen_info_length(reply);
|
|
||||||
si = xcb_xinerama_query_screens_screen_info(reply);
|
|
||||||
p_delete(&reply);
|
|
||||||
|
|
||||||
return si;
|
|
||||||
}
|
|
||||||
|
|
||||||
ScreensInfo *
|
ScreensInfo *
|
||||||
screensinfo_new(xcb_connection_t *conn)
|
screensinfo_new(xcb_connection_t *conn)
|
||||||
{
|
{
|
||||||
ScreensInfo *si;
|
ScreensInfo *si;
|
||||||
|
xcb_xinerama_query_screens_reply_t *xsq;
|
||||||
xcb_xinerama_screen_info_t *xsi;
|
xcb_xinerama_screen_info_t *xsi;
|
||||||
int xinerama_screen_number, screen, screen_to_test;
|
int xinerama_screen_number, screen, screen_to_test;
|
||||||
xcb_screen_t *s;
|
xcb_screen_t *s;
|
||||||
|
@ -103,9 +81,15 @@ screensinfo_new(xcb_connection_t *conn)
|
||||||
|
|
||||||
si = p_new(ScreensInfo, 1);
|
si = p_new(ScreensInfo, 1);
|
||||||
|
|
||||||
if((si->xinerama_is_active = xinerama_is_active(conn)))
|
xsq = xcb_xinerama_query_screens_reply(conn,
|
||||||
|
xcb_xinerama_query_screens_unchecked(conn),
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
if((si->xinerama_is_active = xinerama_is_active(conn)) && xsq)
|
||||||
{
|
{
|
||||||
xsi = xinerama_query_screens(conn, &xinerama_screen_number);
|
xsi = xcb_xinerama_query_screens_screen_info(xsq);
|
||||||
|
xinerama_screen_number = xcb_xinerama_query_screens_screen_info_length(xsq);
|
||||||
|
|
||||||
si->geometry = p_new(area_t, xinerama_screen_number);
|
si->geometry = p_new(area_t, xinerama_screen_number);
|
||||||
si->nscreen = 0;
|
si->nscreen = 0;
|
||||||
|
|
||||||
|
@ -137,8 +121,6 @@ screensinfo_new(xcb_connection_t *conn)
|
||||||
p_delete(&si->geometry);
|
p_delete(&si->geometry);
|
||||||
si->geometry = newgeometry;
|
si->geometry = newgeometry;
|
||||||
}
|
}
|
||||||
|
|
||||||
p_delete(&xsi);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -154,6 +136,9 @@ screensinfo_new(xcb_connection_t *conn)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(xsq)
|
||||||
|
p_delete(&xsq);
|
||||||
|
|
||||||
return si;
|
return si;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue