Resolves: #2195895 ibus_input_context_set_cursor_location(): ibus-x11 SIGSEGV
This commit is contained in:
parent
4a492105b6
commit
cc96b97435
@ -1,6 +1,6 @@
|
|||||||
From 5749b4861ffcaf8083d97c6bf9858257373596ce Mon Sep 17 00:00:00 2001
|
From ffe82832ac5bc6aaa3d5a93004aae97a8b44a60c Mon Sep 17 00:00:00 2001
|
||||||
From: fujiwarat <takao.fujiwara1@gmail.com>
|
From: fujiwarat <takao.fujiwara1@gmail.com>
|
||||||
Date: Wed, 25 Jan 2023 17:26:47 +0900
|
Date: Fri, 26 May 2023 06:35:13 +0900
|
||||||
Subject: [PATCH] Fix SEGV in bus_panel_proxy_focus_in()
|
Subject: [PATCH] Fix SEGV in bus_panel_proxy_focus_in()
|
||||||
|
|
||||||
rhbz#1350291 SEGV in BUS_IS_CONNECTION(skip_connection) in
|
rhbz#1350291 SEGV in BUS_IS_CONNECTION(skip_connection) in
|
||||||
@ -21,6 +21,9 @@ If the mutex is not unlocked, g_mutex_clear() causes assert.
|
|||||||
rhbz#1767691 SEGV in client/x11/main.c:_sighandler().
|
rhbz#1767691 SEGV in client/x11/main.c:_sighandler().
|
||||||
Do not call atexit functions in _sighandler().
|
Do not call atexit functions in _sighandler().
|
||||||
|
|
||||||
|
rhbz#2195895 SEGV in client/x11/main.c:_xim_set_cursor_location()
|
||||||
|
check if IBusInputContext was disconnected.
|
||||||
|
|
||||||
rhbz#1795499 rhbz#1936777 SEGV in ibus_bus_get_bus_address() because of
|
rhbz#1795499 rhbz#1936777 SEGV in ibus_bus_get_bus_address() because of
|
||||||
no _bus->priv.
|
no _bus->priv.
|
||||||
_changed_cb() should not be called after ibus_bus_destroy() is called.
|
_changed_cb() should not be called after ibus_bus_destroy() is called.
|
||||||
@ -44,15 +47,16 @@ BUG=rhbz#1771238
|
|||||||
BUG=rhbz#1767976
|
BUG=rhbz#1767976
|
||||||
BUG=rhbz#1797120
|
BUG=rhbz#1797120
|
||||||
BUG=rhbz#2151344
|
BUG=rhbz#2151344
|
||||||
|
BUG=rhbz#2195895
|
||||||
---
|
---
|
||||||
bus/dbusimpl.c | 47 ++++++++++++++++++++++++---
|
bus/dbusimpl.c | 47 ++++++++++++++++++++++++---
|
||||||
bus/engineproxy.c | 44 +++++++++++++++++++------
|
bus/engineproxy.c | 44 +++++++++++++++++++------
|
||||||
client/x11/main.c | 8 ++++-
|
client/x11/main.c | 56 ++++++++++++++++++++++++++++----
|
||||||
portal/portal.c | 11 +++++++
|
portal/portal.c | 11 +++++++
|
||||||
src/ibusbus.c | 6 ++++
|
src/ibusbus.c | 6 ++++
|
||||||
ui/gtk3/extension.vala | 4 +++
|
ui/gtk3/extension.vala | 4 +++
|
||||||
ui/gtk3/switcher.vala | 73 +++++++++++++++++++++++++-----------------
|
ui/gtk3/switcher.vala | 73 +++++++++++++++++++++++++-----------------
|
||||||
7 files changed, 148 insertions(+), 45 deletions(-)
|
7 files changed, 191 insertions(+), 50 deletions(-)
|
||||||
|
|
||||||
diff --git a/bus/dbusimpl.c b/bus/dbusimpl.c
|
diff --git a/bus/dbusimpl.c b/bus/dbusimpl.c
|
||||||
index 59787a80..af2fbde2 100644
|
index 59787a80..af2fbde2 100644
|
||||||
@ -243,7 +247,7 @@ index b3e16066..ba479b59 100644
|
|||||||
/* FIXME: set destroy callback ? */
|
/* FIXME: set destroy callback ? */
|
||||||
g_task_return_pointer (data->task, engine, NULL);
|
g_task_return_pointer (data->task, engine, NULL);
|
||||||
diff --git a/client/x11/main.c b/client/x11/main.c
|
diff --git a/client/x11/main.c b/client/x11/main.c
|
||||||
index 905fd251..1abea0af 100644
|
index 83d95cb7..804e40ed 100644
|
||||||
--- a/client/x11/main.c
|
--- a/client/x11/main.c
|
||||||
+++ b/client/x11/main.c
|
+++ b/client/x11/main.c
|
||||||
@@ -45,6 +45,7 @@
|
@@ -45,6 +45,7 @@
|
||||||
@ -254,7 +258,142 @@ index 905fd251..1abea0af 100644
|
|||||||
|
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
|
|
||||||
@@ -1269,7 +1270,12 @@ _atexit_cb ()
|
@@ -69,6 +70,7 @@ typedef struct _X11ICONN X11ICONN;
|
||||||
|
typedef struct _X11IC X11IC;
|
||||||
|
struct _X11IC {
|
||||||
|
IBusInputContext *context;
|
||||||
|
+ gboolean ibus_connected;
|
||||||
|
Window client_window;
|
||||||
|
Window focus_window;
|
||||||
|
gint32 input_style;
|
||||||
|
@@ -327,6 +329,18 @@ _xim_store_ic_values (X11IC *x11ic, IMChangeICStruct *call_data)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+ibus_ic_connection_closed_cb (GDBusConnection *connection,
|
||||||
|
+ gboolean remote_peer_vanished,
|
||||||
|
+ GError *error,
|
||||||
|
+ X11IC *x11ic)
|
||||||
|
+{
|
||||||
|
+ /* rhbz#2195895 The moment of the IBusBus disconnection would be
|
||||||
|
+ * different from the moment of XIM_DISCONNECT.
|
||||||
|
+ */
|
||||||
|
+ x11ic->ibus_connected = FALSE;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
|
||||||
|
static int
|
||||||
|
xim_create_ic (XIMS xims, IMChangeICStruct *call_data)
|
||||||
|
@@ -334,6 +348,7 @@ xim_create_ic (XIMS xims, IMChangeICStruct *call_data)
|
||||||
|
static int base_icid = 1;
|
||||||
|
X11IC *x11ic;
|
||||||
|
guint32 capabilities = IBUS_CAP_FOCUS;
|
||||||
|
+ GDBusConnection *connection;
|
||||||
|
|
||||||
|
call_data->icid = base_icid ++;
|
||||||
|
|
||||||
|
@@ -345,8 +360,9 @@ xim_create_ic (XIMS xims, IMChangeICStruct *call_data)
|
||||||
|
|
||||||
|
x11ic->icid = call_data->icid;
|
||||||
|
x11ic->connect_id = call_data->connect_id;
|
||||||
|
- x11ic->conn = (X11ICONN *)g_hash_table_lookup (_connections,
|
||||||
|
- GINT_TO_POINTER ((gint) call_data->connect_id));
|
||||||
|
+ x11ic->conn = (X11ICONN *)g_hash_table_lookup (
|
||||||
|
+ _connections,
|
||||||
|
+ GINT_TO_POINTER ((gint) call_data->connect_id));
|
||||||
|
if (x11ic->conn == NULL) {
|
||||||
|
g_slice_free (X11IC, x11ic);
|
||||||
|
g_return_val_if_reached (0);
|
||||||
|
@@ -376,6 +392,10 @@ xim_create_ic (XIMS xims, IMChangeICStruct *call_data)
|
||||||
|
G_CALLBACK (_context_enabled_cb), x11ic);
|
||||||
|
g_signal_connect (x11ic->context, "disabled",
|
||||||
|
G_CALLBACK (_context_disabled_cb), x11ic);
|
||||||
|
+ connection = g_dbus_proxy_get_connection (G_DBUS_PROXY (x11ic->context));
|
||||||
|
+ x11ic->ibus_connected = !g_dbus_connection_is_closed (connection);
|
||||||
|
+ g_signal_connect (connection, "closed",
|
||||||
|
+ G_CALLBACK (ibus_ic_connection_closed_cb), x11ic);
|
||||||
|
|
||||||
|
|
||||||
|
if (x11ic->input_style & XIMPreeditCallbacks)
|
||||||
|
@@ -400,11 +420,19 @@ xim_destroy_ic (XIMS xims, IMChangeICStruct *call_data)
|
||||||
|
LOG (1, "XIM_DESTROY_IC ic=%d connect_id=%d",
|
||||||
|
call_data->icid, call_data->connect_id);
|
||||||
|
|
||||||
|
- x11ic = (X11IC *)g_hash_table_lookup (_x11_ic_table,
|
||||||
|
- GINT_TO_POINTER ((gint) call_data->icid));
|
||||||
|
+ x11ic = (X11IC *)g_hash_table_lookup (
|
||||||
|
+ _x11_ic_table,
|
||||||
|
+ GINT_TO_POINTER ((gint) call_data->icid));
|
||||||
|
g_return_val_if_fail (x11ic != NULL, 0);
|
||||||
|
|
||||||
|
if (x11ic->context) {
|
||||||
|
+ GDBusConnection *connection =
|
||||||
|
+ g_dbus_proxy_get_connection (G_DBUS_PROXY (x11ic->context));
|
||||||
|
+ x11ic->ibus_connected = FALSE;
|
||||||
|
+ g_signal_handlers_disconnect_by_func (
|
||||||
|
+ connection,
|
||||||
|
+ (GCallback)ibus_ic_connection_closed_cb,
|
||||||
|
+ x11ic);
|
||||||
|
ibus_proxy_destroy ((IBusProxy *)x11ic->context);
|
||||||
|
g_object_unref (x11ic->context);
|
||||||
|
x11ic->context = NULL;
|
||||||
|
@@ -412,7 +440,8 @@ xim_destroy_ic (XIMS xims, IMChangeICStruct *call_data)
|
||||||
|
|
||||||
|
g_hash_table_remove (_x11_ic_table,
|
||||||
|
GINT_TO_POINTER ((gint) call_data->icid));
|
||||||
|
- x11ic->conn->clients = g_list_remove (x11ic->conn->clients, (gconstpointer)x11ic);
|
||||||
|
+ x11ic->conn->clients = g_list_remove (x11ic->conn->clients,
|
||||||
|
+ (gconstpointer)x11ic);
|
||||||
|
|
||||||
|
g_free (x11ic->preedit_string);
|
||||||
|
x11ic->preedit_string = NULL;
|
||||||
|
@@ -438,6 +467,8 @@ xim_set_ic_focus (XIMS xims, IMChangeFocusStruct *call_data)
|
||||||
|
x11ic = (X11IC *) g_hash_table_lookup (_x11_ic_table,
|
||||||
|
GINT_TO_POINTER ((gint) call_data->icid));
|
||||||
|
g_return_val_if_fail (x11ic != NULL, 0);
|
||||||
|
+ if (!x11ic->ibus_connected)
|
||||||
|
+ return 1;
|
||||||
|
|
||||||
|
ibus_input_context_focus_in (x11ic->context);
|
||||||
|
_xim_set_cursor_location (x11ic);
|
||||||
|
@@ -456,6 +487,8 @@ xim_unset_ic_focus (XIMS xims, IMChangeFocusStruct *call_data)
|
||||||
|
x11ic = (X11IC *) g_hash_table_lookup (_x11_ic_table,
|
||||||
|
GINT_TO_POINTER ((gint) call_data->icid));
|
||||||
|
g_return_val_if_fail (x11ic != NULL, 0);
|
||||||
|
+ if (!x11ic->ibus_connected)
|
||||||
|
+ return 1;
|
||||||
|
|
||||||
|
ibus_input_context_focus_out (x11ic->context);
|
||||||
|
|
||||||
|
@@ -594,6 +627,8 @@ xim_forward_event (XIMS xims, IMForwardEventStruct *call_data)
|
||||||
|
x11ic = (X11IC *) g_hash_table_lookup (_x11_ic_table,
|
||||||
|
GINT_TO_POINTER ((gint) call_data->icid));
|
||||||
|
g_return_val_if_fail (x11ic != NULL, 0);
|
||||||
|
+ if (!x11ic->ibus_connected)
|
||||||
|
+ return 0;
|
||||||
|
|
||||||
|
xevent = (XKeyEvent*) &(call_data->event);
|
||||||
|
|
||||||
|
@@ -836,6 +871,8 @@ _xim_set_cursor_location (X11IC *x11ic)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (!x11ic->ibus_connected)
|
||||||
|
+ return;
|
||||||
|
ibus_input_context_set_cursor_location (x11ic->context,
|
||||||
|
preedit_area.x,
|
||||||
|
preedit_area.y,
|
||||||
|
@@ -916,6 +953,8 @@ xim_reset_ic (XIMS xims, IMResetICStruct *call_data)
|
||||||
|
x11ic = (X11IC *) g_hash_table_lookup (_x11_ic_table,
|
||||||
|
GINT_TO_POINTER ((gint) call_data->icid));
|
||||||
|
g_return_val_if_fail (x11ic != NULL, 0);
|
||||||
|
+ if (!x11ic->ibus_connected)
|
||||||
|
+ return 1;
|
||||||
|
|
||||||
|
ibus_input_context_reset (x11ic->context);
|
||||||
|
|
||||||
|
@@ -1275,7 +1314,12 @@ _atexit_cb ()
|
||||||
static void
|
static void
|
||||||
_sighandler (int sig)
|
_sighandler (int sig)
|
||||||
{
|
{
|
||||||
@ -434,5 +573,5 @@ index 9400e9ba..2ecbdac1 100644
|
|||||||
#if VALA_0_34
|
#if VALA_0_34
|
||||||
seat.ungrab();
|
seat.ungrab();
|
||||||
--
|
--
|
||||||
2.38.1
|
2.40.0
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@
|
|||||||
|
|
||||||
Name: ibus
|
Name: ibus
|
||||||
Version: 1.5.28
|
Version: 1.5.28
|
||||||
Release: 5%{?dist}
|
Release: 6%{?dist}
|
||||||
Summary: Intelligent Input Bus for Linux OS
|
Summary: Intelligent Input Bus for Linux OS
|
||||||
License: LGPL-2.0-or-later
|
License: LGPL-2.0-or-later
|
||||||
URL: https://github.com/ibus/%name/wiki
|
URL: https://github.com/ibus/%name/wiki
|
||||||
@ -559,6 +559,9 @@ dconf update || :
|
|||||||
%{_datadir}/installed-tests/ibus
|
%{_datadir}/installed-tests/ibus
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri May 26 2023 Takao Fujiwara <tfujiwar@redhat.com> - 1.5.28-6
|
||||||
|
- Resolves: #2195895 ibus_input_context_set_cursor_location(): ibus-x11 SIGSEGV
|
||||||
|
|
||||||
* Fri May 12 2023 Takao Fujiwara <tfujiwar@redhat.com> - 1.5.28-5
|
* Fri May 12 2023 Takao Fujiwara <tfujiwar@redhat.com> - 1.5.28-5
|
||||||
- Fix cross compiling with gen-internal-compose-table
|
- Fix cross compiling with gen-internal-compose-table
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user