Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package xcb-imdkit for openSUSE:Factory checked in at 2022-11-22 16:10:51 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/xcb-imdkit (Old) and /work/SRC/openSUSE:Factory/.xcb-imdkit.new.1597 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "xcb-imdkit" Tue Nov 22 16:10:51 2022 rev:2 rq:1037279 version:1.0.4 Changes: -------- --- /work/SRC/openSUSE:Factory/xcb-imdkit/xcb-imdkit.changes 2022-02-09 20:39:26.490410625 +0100 +++ /work/SRC/openSUSE:Factory/.xcb-imdkit.new.1597/xcb-imdkit.changes 2022-11-22 16:10:58.890273081 +0100 @@ -1,0 +2,9 @@ +Tue Nov 22 11:29:56 UTC 2022 - Marguerite Su <i...@marguerite.su> + +- update version 1.0.4 + * Fix reading client messages when Xlib sends messages too fast. + Also avoid to infinitely increase the property name when sending + new messages but use a longer loop to avoid issues of X property + atom re-usage like Xlib + +------------------------------------------------------------------- Old: ---- xcb-imdkit-1.0.3.tar.xz New: ---- xcb-imdkit-1.0.4.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ xcb-imdkit.spec ++++++ --- /var/tmp/diff_new_pack.vDrzVA/_old 2022-11-22 16:10:59.370275516 +0100 +++ /var/tmp/diff_new_pack.vDrzVA/_new 2022-11-22 16:10:59.374275537 +0100 @@ -1,7 +1,7 @@ # # spec file for package xcb-imdkit # -# Copyright (c) 2020 SUSE LLC +# Copyright (c) 2022 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -18,7 +18,7 @@ %define _suffix 1 Name: xcb-imdkit -Version: 1.0.3 +Version: 1.0.4 Release: 0 Summary: An implementation of xim protocol in xcb License: LGPL-2.1-only ++++++ xcb-imdkit-1.0.3.tar.xz -> xcb-imdkit-1.0.4.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xcb-imdkit-1.0.3/CMakeLists.txt new/xcb-imdkit-1.0.4/CMakeLists.txt --- old/xcb-imdkit-1.0.3/CMakeLists.txt 2021-03-21 19:05:46.136847000 +0100 +++ new/xcb-imdkit-1.0.4/CMakeLists.txt 2022-11-20 08:07:21.711724500 +0100 @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.8) -project(xcb-imdkit VERSION 1.0.3) +project(xcb-imdkit VERSION 1.0.4) find_package(ECM 0.0.11 REQUIRED NO_MODULE) set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH}) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xcb-imdkit-1.0.3/src/imclient.c new/xcb-imdkit-1.0.4/src/imclient.c --- old/xcb-imdkit-1.0.3/src/imclient.c 2021-03-01 02:39:49.285544900 +0100 +++ new/xcb-imdkit-1.0.4/src/imclient.c 2022-11-13 03:21:06.749968800 +0100 @@ -36,7 +36,8 @@ bool _xcb_xim_send_message(xcb_xim_t *im, uint8_t *data, size_t length) { char atomName[64]; - int len = sprintf(atomName, "_client%u_%u", im->connect_id, im->sequence++); + int len = sprintf(atomName, "_client%u", im->sequence++); + im->sequence = (im->sequence + 1) % XCB_XIM_ATOM_ROTATION_SIZE; return _xcb_send_xim_message(im->conn, im->atoms[XIM_ATOM_XIM_PROTOCOL], im->accept_win, data, length, atomName, len); } @@ -301,7 +302,7 @@ } xcb_im_packet_header_fr_t hdr; - uint8_t *message = _xcb_read_xim_message(im->conn, im->accept_win, + uint8_t *message = _xcb_read_xim_message(im->conn, im->accept_win, NULL, client_message, &hdr, false); if (!message) { @@ -685,8 +686,9 @@ } xcb_im_packet_header_fr_t hdr; - uint8_t *message = _xcb_read_xim_message(im->conn, im->im_client_window, - clientmessage, &hdr, false); + uint8_t *message = + _xcb_read_xim_message(im->conn, im->im_client_window, &im->offsets, + clientmessage, &hdr, false); if (message) { _xcb_xim_handle_message(im, &hdr, message); free(message); @@ -934,6 +936,12 @@ list_remove(&item->list); _xcb_xim_request_free(item); } + + while (im->offsets) { + xcb_im_property_offset_t *p = im->offsets; + HASH_DEL(im->offsets, im->offsets); + free(p); + } } void xcb_xim_close(xcb_xim_t *im) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xcb-imdkit-1.0.3/src/imclient_p.h new/xcb-imdkit-1.0.4/src/imclient_p.h --- old/xcb-imdkit-1.0.3/src/imclient_p.h 2021-03-01 02:10:06.662716400 +0100 +++ new/xcb-imdkit-1.0.4/src/imclient_p.h 2022-09-16 18:46:02.224847000 +0200 @@ -137,6 +137,8 @@ xcb_window_t im_client_window; + xcb_im_property_offset_t *offsets; + // _xcb_xim_connect_wait int major_code; int minor_code; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xcb-imdkit-1.0.3/src/imdkit.c new/xcb-imdkit-1.0.4/src/imdkit.c --- old/xcb-imdkit-1.0.3/src/imdkit.c 2020-11-25 03:55:37.581321200 +0100 +++ new/xcb-imdkit-1.0.4/src/imdkit.c 2022-11-13 03:21:06.846635800 +0100 @@ -573,8 +573,8 @@ client->byte_order = ev->data.data8[XCB_IM_HEADER_SIZE]; } } - return _xcb_read_xim_message(im->conn, client->accept_win, ev, hdr, - client->byte_order != im->byte_order); + return _xcb_read_xim_message(im->conn, client->accept_win, &client->offsets, + ev, hdr, client->byte_order != im->byte_order); } void _xcb_im_handle_message(xcb_im_t *im, xcb_im_client_t *client, @@ -1009,6 +1009,12 @@ free(p); } + while (client->offsets) { + xcb_im_property_offset_t *p = client->offsets; + HASH_DEL(client->offsets, client->offsets); + free(p); + } + client->hh1.next = im->free_list; im->free_list = client; } @@ -1140,6 +1146,7 @@ char atomName[64]; int len = sprintf(atomName, "_server%u_%u", client->connect_id, im->sequence++); + im->sequence = (im->sequence + 1) % XCB_XIM_ATOM_ROTATION_SIZE; return _xcb_send_xim_message(im->conn, im->atoms[XIM_ATOM_XIM_PROTOCOL], client->client_win, data, length, atomName, len); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xcb-imdkit-1.0.3/src/imdkit_p.h new/xcb-imdkit-1.0.4/src/imdkit_p.h --- old/xcb-imdkit-1.0.3/src/imdkit_p.h 2020-05-15 01:41:30.944523800 +0200 +++ new/xcb-imdkit-1.0.4/src/imdkit_p.h 2022-11-13 03:21:06.899969300 +0100 @@ -147,6 +147,8 @@ xcb_im_input_context_t *input_contexts; list_head queue; + xcb_im_property_offset_t *offsets; + UT_hash_handle hh1; UT_hash_handle hh2; }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xcb-imdkit-1.0.3/src/message.c new/xcb-imdkit-1.0.4/src/message.c --- old/xcb-imdkit-1.0.3/src/message.c 2020-08-06 03:13:00.369333000 +0200 +++ new/xcb-imdkit-1.0.4/src/message.c 2022-11-13 03:22:32.646839100 +0100 @@ -12,6 +12,43 @@ #include <stdlib.h> #include <string.h> +static uint32_t lookup_offset(xcb_im_property_offset_t **offsets, + xcb_atom_t atom) { + if (!offsets) { + return 0; + } + xcb_im_property_offset_t *result = NULL; + HASH_FIND(hh, *offsets, &atom, sizeof(xcb_atom_t), result); + if (!result) { + return 0; + } + return result->offset; +} + +static void set_offset(xcb_im_property_offset_t **offsets, xcb_atom_t atom, + uint32_t offset) { + if (!offsets) { + return; + } + xcb_im_property_offset_t *result = NULL; + HASH_FIND(hh, *offsets, &atom, sizeof(xcb_atom_t), result); + if (!result) { + if (offset != 0) { + result = calloc(1, sizeof(xcb_im_property_offset_t)); + result->atom = atom; + result->offset = offset; + HASH_ADD(hh, *offsets, atom, sizeof(xcb_atom_t), result); + } + } else { + if (offset == 0) { + HASH_DEL(*offsets, result); + free(result); + } else { + result->offset = offset; + } + } +} + uint8_t *_xcb_new_xim_message(uint8_t major_opcode, uint8_t minor_opcode, size_t length, bool swap) { uint8_t *message = calloc(length + XCB_IM_HEADER_SIZE, 1); @@ -114,6 +151,7 @@ } uint8_t *_xcb_read_xim_message(xcb_connection_t *conn, xcb_window_t window, + xcb_im_property_offset_t **offsets, xcb_client_message_event_t *ev, xcb_im_packet_header_fr_t *hdr, bool swap) { uint8_t *p = NULL; @@ -138,8 +176,13 @@ size_t length = ev->data.data32[0]; xcb_atom_t atom = ev->data.data32[1]; - xcb_get_property_cookie_t cookie = xcb_get_property( - conn, true, window, atom, XCB_ATOM_ANY, 0L, length); + uint32_t offset = lookup_offset(offsets, atom); + uint32_t end = offset + length; + uint32_t dword_begin = offset / 4; + uint32_t dword_end = (end + 3) / 4; + xcb_get_property_cookie_t cookie = + xcb_get_property(conn, true, window, atom, XCB_ATOM_ANY, + dword_begin, dword_end - dword_begin); xcb_get_property_reply_t *reply = xcb_get_property_reply(conn, cookie, NULL); @@ -151,17 +194,12 @@ return (unsigned char *)NULL; } - rec = xcb_get_property_value(reply); - - if (length != reply->value_len) { - length = reply->value_len; - } + rec = xcb_get_property_value(reply) + (offset % 4); - // make length into byte - if (reply->format == 16) { - length *= 2; - } else if (reply->format == 32) { - length *= 4; + if (reply->bytes_after) { + set_offset(offsets, atom, offset + length); + } else { + set_offset(offsets, atom, 0); } uint8_t_read(&hdr->major_opcode, &rec, &length, swap); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xcb-imdkit-1.0.3/src/message.h new/xcb-imdkit-1.0.4/src/message.h --- old/xcb-imdkit-1.0.3/src/message.h 2020-05-09 00:08:31.757092200 +0200 +++ new/xcb-imdkit-1.0.4/src/message.h 2022-11-13 03:21:06.983302800 +0100 @@ -11,9 +11,16 @@ #include <stdbool.h> #include <stddef.h> #include <stdint.h> +#include <uthash.h> #include <xcb/xcb.h> #include <xcb/xproto.h> +typedef struct _xcb_im_property_offset_t { + xcb_atom_t atom; + uint32_t offset; + UT_hash_handle hh; +} xcb_im_property_offset_t; + // Return a new alloc xim message. length is the content size without header // size. uint8_t *_xcb_new_xim_message(uint8_t major_opcode, uint8_t minor_opcode, @@ -34,6 +41,7 @@ bool swap); uint8_t *_xcb_read_xim_message(xcb_connection_t *conn, xcb_window_t window, + xcb_im_property_offset_t **offsets, xcb_client_message_event_t *ev, xcb_im_packet_header_fr_t *hdr, bool swap); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xcb-imdkit-1.0.3/src/ximproto_p.h new/xcb-imdkit-1.0.4/src/ximproto_p.h --- old/xcb-imdkit-1.0.3/src/ximproto_p.h 2020-05-09 00:08:31.757092200 +0200 +++ new/xcb-imdkit-1.0.4/src/ximproto_p.h 2022-09-16 09:09:56.424637600 +0200 @@ -54,4 +54,6 @@ : XCB_XIM_SYNC_REPLY, xcb_im_geometry_fr_t \ : XCB_XIM_GEOMETRY) +#define XCB_XIM_ATOM_ROTATION_SIZE 1024 + #endif // _XCB_IMDKIT_XIMPROTO_P_H_