diff options
Diffstat (limited to 'xcb-send-message.patch')
-rw-r--r-- | xcb-send-message.patch | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/xcb-send-message.patch b/xcb-send-message.patch new file mode 100644 index 000000000000..c3fb363244e3 --- /dev/null +++ b/xcb-send-message.patch @@ -0,0 +1,58 @@ +diff --git a/xwayland/xwm.c b/xwayland/xwm.c +index 2c437e83..478ea6fa 100644 +--- a/xwayland/xwm.c ++++ b/xwayland/xwm.c +@@ -217,6 +217,25 @@ static void xwm_set_net_active_window(struct wlr_xwm *xwm, + xwm->atoms[WINDOW], 32, 1, &window); + } + ++/* ++ * Wrapper for xcb_send_event, which ensures that the event data is 32 byte big. ++ */ ++static xcb_void_cookie_t xwm_send_event(xcb_connection_t *c, ++ uint8_t propagate, xcb_window_t destination, ++ uint32_t event_mask, const char *event, uint32_t length) ++{ ++ if (length == 32) { ++ return xcb_send_event(c, propagate, destination, event_mask, event); ++ } else if (length < 32) { ++ char buf[32]; ++ memcpy(buf, event, length); ++ memset(buf + length, 0, 32 - length); ++ return xcb_send_event(c, propagate, destination, event_mask, buf); ++ } else { ++ assert(false && "Event too long"); ++ } ++} ++ + static void xwm_send_wm_message(struct wlr_xwayland_surface *surface, + xcb_client_message_data_t *data, uint32_t event_mask) { + struct wlr_xwm *xwm = surface->xwm; +@@ -230,11 +249,12 @@ static void xwm_send_wm_message(struct wlr_xwayland_surface *surface, + .data = *data, + }; + +- xcb_send_event(xwm->xcb_conn, ++ xwm_send_event(xwm->xcb_conn, + 0, // propagate + surface->window_id, + event_mask, +- (const char *)&event); ++ (const char *)&event, ++ sizeof(event)); + xcb_flush(xwm->xcb_conn); + } + +@@ -1795,9 +1815,10 @@ void wlr_xwayland_surface_configure(struct wlr_xwayland_surface *xsurface, + .height = height, + }; + +- xcb_send_event(xwm->xcb_conn, 0, xsurface->window_id, ++ xwm_send_event(xwm->xcb_conn, 0, xsurface->window_id, + XCB_EVENT_MASK_STRUCTURE_NOTIFY, +- (const char *)&configure_notify); ++ (const char *)&configure_notify, ++ sizeof(configure_notify)); + } + + xcb_flush(xwm->xcb_conn); |