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_

Reply via email to