Bug#1042759: scim-gtk-immodule: assumes windowing system is X11, segfaults if not

Simon McVittie smcv at debian.org
Mon Jul 31 23:36:27 BST 2023


Control: retitle -1 scim-gtk-immodule: assumes windowing system is X11, segfaults if not
Control: reassign -1 scim-gtk-immodule 1.4.18+git20211204-0.1
Control: affects -1 + src:gtk4
Control: severity -1 important

On Mon, 31 Jul 2023 at 20:57:25 +0200, Michał Byrecki wrote:
> > (org.gnome.Nautilus:51577): GLib-GObject-WARNING **: 20:53:04.844:
> > invalid cast from 'GdkWaylandToplevel' to 'GdkX11Surface'
> > 
> > (org.gnome.Nautilus:51577): GLib-GObject-WARNING **: 20:53:04.844:
> > invalid cast from 'GdkWaylandDisplay' to 'GdkX11Display'

These warnings indicate that a component is assuming that all windows
are X11 windows, and all displays are X11 displays; and that's also the
cause of the segfault, while calling XGetWindowAttributes on something
that is not a valid X11 window (probably a null pointer dereference).

> > #1  0x00007ffff070d467 in  () at /usr/lib/x86_64-linux-gnu/gtk-4.0/4.0.0/immodules/libim-scim.so

This component seems to be the one that is making that assumption.
The bug affects multiple GTK 4 apps because it's a module that has been
loaded into GTK 4.

Looking at scim-gtk-immodule's GTK 4 code in
<https://github.com/scim-im/scim/commit/d35bf5d331d885e94914fea6eab9c56f20666c8d>,
it does things like this:

> #ifdef GDK_WINDOWING_X11
>     GdkX11Display *display = NULL;
> 
>     if (widget != NULL) {
>         display = GDK_X11_DISPLAY (gtk_widget_get_display(widget));
>     } else {
>         display = GDK_X11_DISPLAY (gdk_display_get_default ());
>     }

That's not correct code: just because the X11 windowing system is
compiled into GTK, that doesn't mean it is the one currently in use. The
GdkDisplay object might be a GdkX11Display, but equally it might be a
GdkWaylandDisplay. (That's why GDK_BACKEND=x11 is a workaround for this,
because when that environment variable is set, the X11 windowing system
*is* the one in use.)

I haven't checked what scim-gtk-immodule does for GTK 3, but if it has the
same pattern there, it would be equally problematic for GTK 3.

The correct pattern is more like this:

    GdkDisplay *display;

    if (widget != NULL) {
        display = gtk_widget_get_display (widget));
    } else {
        display = gdk_display_get_default ();
    }

#ifdef GDK_WINDOWING_X11
    if (GDK_IS_X11_DISPLAY (display) {
        GdkX11Display *x11_display = GDK_X11_DISPLAY (display);

        /* ... do X11 things with x11_display ... */
    }
#endif
#ifdef GDK_WINDOWING_WAYLAND
    if (GDK_IS_WAYLAND_DISPLAY (display) {
        GdkWaylandDisplay *wayland_display = GDK_WAYLAND_DISPLAY (display);

        /* ... do Wayland things with wayland_display ... */
    }
#endif

Until scim-gtk-immodule is fixed, the workaround would be to either set
GDK_BACKEND=x11, or use an X11 desktop environment or a desktop environment
in X11 mode (like the "GNOME (Xorg)" option for GNOME), or remove
scim-gtk-immodule and use a different input method framework such as ibus.

ibus is the input method framework recommended by GNOME upstream. I can't
read or write any of the languages supported by scim myself, but many of
the input methods available for scim seem to be available for ibus too,
for example ibus-anthy seems to be the ibus equivalent of scim-anthy.

    smcv



More information about the pkg-gnome-maintainers mailing list