public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
From: Takao Fujiwara <tfujiwar@redhat.com>
To: git-commits@fedoraproject.org
Subject: [rpms/ibus] autotool: Fix refcounting issues in IBusText & IBusProperty
Date: Sun, 31 May 2026 02:07:49 GMT	[thread overview]
Message-ID: <178019326951.1.3058504036612900225.rpms-ibus-dfb5d9acdb2c@fedoraproject.org> (raw)

A new commit has been pushed.

Repo   : rpms/ibus
Branch : autotool
Commit : dfb5d9acdb2c442deb4c7232f68bce0d73687908
Author : Takao Fujiwara <tfujiwar@redhat.com>
Date   : 2022-03-31T19:50:09+09:00
Stats  : +274/-1 in 2 file(s)
URL    : https://src.fedoraproject.org/rpms/ibus/c/dfb5d9acdb2c442deb4c7232f68bce0d73687908?branch=autotool

Log:
Fix refcounting issues in IBusText & IBusProperty

---
diff --git a/ibus-HEAD.patch b/ibus-HEAD.patch
index ca0a6cb..c3ef9f9 100644
--- a/ibus-HEAD.patch
+++ b/ibus-HEAD.patch
@@ -1,3 +1,273 @@
+From 17648f0522910480b6c5dd4f5356ca1f6c160bf5 Mon Sep 17 00:00:00 2001
+From: Carlos Garnacho <carlosg@gnome.org>
+Date: Tue, 29 Mar 2022 22:48:19 +0200
+Subject: [PATCH] src: Fix refcounting issues
+
+Commit 5a455b1ead attempted to fix both GLib warnings around
+floating references and other presumed refcounting issues. However
+it missed 2 kinds of bugs:
+
+- The places that take an IBusText created from a static string
+  were made to avoid freeing it afterwards, but the staticness refers
+  to the string content, not the object itself.
+- The places that are documented to emit signals on floating object
+  references used to do the following after signal emission:
+
+  if (g_object_is_floating (object))
+    g_object_unref (object)
+
+  And did possibly trigger GLib warnings were changed to:
+
+  if (g_object_is_floating (object))
+    g_object_sink_ref (object);
+  g_object_unref (object);
+
+  Which fixes the GLib warning for floating references, but do
+  unintendedly steal one reference away for non floating references.
+
+This commit is essentially a revert of commit 5a455b1ead, but
+addressing both things differently:
+
+- All label/tooltip/symbol IBusText properties in IBusProperty do
+  now always sink the reference of the stored object.
+
+- All places documented as maybe using objects with a floating reference
+  on signals changed to doing:
+
+  if (g_object_is_floating (object)) {
+    g_object_ref_sink (object);
+    g_object_unref (object);
+  }
+
+  So the floating reference is owned and unreferenced without warnings,
+  but already owned references are left unchanged.
+
+This addresses the possible GLib warnings, fixes the possible double
+unrefs happening on IBusText used in signals, and fixes the missing
+unrefs on IBusText objects created from static strings.
+
+BUG=https://github.com/ibus/ibus/issues/2393
+BUG=https://github.com/ibus/ibus/issues/2387
+---
+ src/ibusinputcontext.c | 35 +++++++++++++++++++++--------------
+ src/ibusproperty.c     | 32 +++++++++++++++++---------------
+ 2 files changed, 38 insertions(+), 29 deletions(-)
+
+diff --git a/src/ibusinputcontext.c b/src/ibusinputcontext.c
+index 4b27551b..7981de38 100644
+--- a/src/ibusinputcontext.c
++++ b/src/ibusinputcontext.c
+@@ -549,9 +549,10 @@ ibus_input_context_g_signal (GDBusProxy  *proxy,
+         g_variant_unref (variant);
+         g_signal_emit (context, context_signals[COMMIT_TEXT], 0, text);
+ 
+-        if (g_object_is_floating (text))
++        if (g_object_is_floating (text)) {
+             g_object_ref_sink (text);
+-        g_object_unref (text);
++            g_object_unref (text);
++        }
+         return;
+     }
+     if (g_strcmp0 (signal_name, "UpdatePreeditText") == 0) {
+@@ -569,9 +570,10 @@ ibus_input_context_g_signal (GDBusProxy  *proxy,
+                        cursor_pos,
+                        visible);
+ 
+-        if (g_object_is_floating (text))
++        if (g_object_is_floating (text)) {
+             g_object_ref_sink (text);
+-        g_object_unref (text);
++            g_object_unref (text);
++        }
+         return;
+     }
+     if (g_strcmp0 (signal_name, "UpdatePreeditTextWithMode") == 0) {
+@@ -592,9 +594,10 @@ ibus_input_context_g_signal (GDBusProxy  *proxy,
+                        visible,
+                        mode);
+ 
+-        if (g_object_is_floating (text))
++        if (g_object_is_floating (text)) {
+             g_object_ref_sink (text);
+-        g_object_unref (text);
++            g_object_unref (text);
++        }
+         return;
+     }
+ 
+@@ -621,9 +624,10 @@ ibus_input_context_g_signal (GDBusProxy  *proxy,
+                        0,
+                        text,
+                        visible);
+-        if (g_object_is_floating (text))
++        if (g_object_is_floating (text)) {
+             g_object_ref_sink (text);
+-        g_object_unref (text);
++            g_object_unref (text);
++        }
+         return;
+     }
+ 
+@@ -640,9 +644,10 @@ ibus_input_context_g_signal (GDBusProxy  *proxy,
+                        0,
+                        table,
+                        visible);
+-        if (g_object_is_floating (table))
++        if (g_object_is_floating (table)) {
+             g_object_ref_sink (table);
+-        g_object_unref (table);
++            g_object_unref (table);
++        }
+         return;
+ 
+     }
+@@ -659,9 +664,10 @@ ibus_input_context_g_signal (GDBusProxy  *proxy,
+                        0,
+                        prop_list);
+ 
+-        if (g_object_is_floating (prop_list))
++        if (g_object_is_floating (prop_list)) {
+             g_object_ref_sink (prop_list);
+-        g_object_unref (prop_list);
++            g_object_unref (prop_list);
++        }
+         return;
+     }
+ 
+@@ -673,9 +679,10 @@ ibus_input_context_g_signal (GDBusProxy  *proxy,
+ 
+         g_signal_emit (context, context_signals[UPDATE_PROPERTY], 0, prop);
+ 
+-        if (g_object_is_floating (prop))
++        if (g_object_is_floating (prop)) {
+             g_object_ref_sink (prop);
+-        g_object_unref (prop);
++            g_object_unref (prop);
++        }
+         return;
+     }
+ 
+diff --git a/src/ibusproperty.c b/src/ibusproperty.c
+index 6d4ed088..cd8a0e2a 100644
+--- a/src/ibusproperty.c
++++ b/src/ibusproperty.c
+@@ -336,20 +336,17 @@ ibus_property_destroy (IBusProperty *prop)
+     prop->priv->icon = NULL;
+ 
+     if (prop->priv->label) {
+-        if (!ibus_text_get_is_static (prop->priv->label))
+-            g_object_unref (prop->priv->label);
++        g_object_unref (prop->priv->label);
+         prop->priv->label = NULL;
+     }
+ 
+     if (prop->priv->symbol) {
+-        if (!ibus_text_get_is_static (prop->priv->symbol))
+-            g_object_unref (prop->priv->symbol);
++        g_object_unref (prop->priv->symbol);
+         prop->priv->symbol = NULL;
+     }
+ 
+     if (prop->priv->tooltip) {
+-        if (!ibus_text_get_is_static (prop->priv->tooltip))
+-            g_object_unref (prop->priv->tooltip);
++        g_object_unref (prop->priv->tooltip);
+         prop->priv->tooltip = NULL;
+     }
+ 
+@@ -404,7 +401,7 @@ ibus_property_deserialize (IBusProperty *prop,
+     g_variant_get_child (variant, retval++, "u", &prop->priv->type);
+ 
+     GVariant *subvar = g_variant_get_child_value (variant, retval++);
+-    if (prop->priv->label && !ibus_text_get_is_static (prop->priv->label)) {
++    if (prop->priv->label) {
+         g_object_unref (prop->priv->label);
+     }
+     prop->priv->label = IBUS_TEXT (ibus_serializable_deserialize (subvar));
+@@ -414,7 +411,7 @@ ibus_property_deserialize (IBusProperty *prop,
+     ibus_g_variant_get_child_string (variant, retval++, &prop->priv->icon);
+ 
+     subvar = g_variant_get_child_value (variant, retval++);
+-    if (prop->priv->tooltip && !ibus_text_get_is_static (prop->priv->tooltip)) {
++    if (prop->priv->tooltip) {
+         g_object_unref (prop->priv->tooltip);
+     }
+     prop->priv->tooltip = IBUS_TEXT (ibus_serializable_deserialize (subvar));
+@@ -435,7 +432,7 @@ ibus_property_deserialize (IBusProperty *prop,
+ 
+     /* Keep the serialized order for the compatibility when add new members. */
+     subvar = g_variant_get_child_value (variant, retval++);
+-    if (prop->priv->symbol && !ibus_text_get_is_static (prop->priv->symbol)) {
++    if (prop->priv->symbol) {
+         g_object_unref (prop->priv->symbol);
+     }
+     prop->priv->symbol = IBUS_TEXT (ibus_serializable_deserialize (subvar));
+@@ -567,7 +564,7 @@ ibus_property_set_label (IBusProperty *prop,
+     g_assert (IBUS_IS_PROPERTY (prop));
+     g_return_if_fail (label == NULL || IBUS_IS_TEXT (label));
+ 
+-    if (prop->priv->label && !ibus_text_get_is_static (prop->priv->label)) {
++    if (prop->priv->label) {
+         g_object_unref (prop->priv->label);
+     }
+ 
+@@ -575,8 +572,10 @@ ibus_property_set_label (IBusProperty *prop,
+         prop->priv->label = ibus_text_new_from_static_string ("");
+     }
+     else {
+-        prop->priv->label = g_object_ref_sink (label);
++        prop->priv->label = label;
+     }
++
++    g_object_ref_sink (prop->priv->label);
+ }
+ 
+ void
+@@ -586,7 +585,7 @@ ibus_property_set_symbol (IBusProperty *prop,
+     g_assert (IBUS_IS_PROPERTY (prop));
+     g_return_if_fail (symbol == NULL || IBUS_IS_TEXT (symbol));
+ 
+-    if (prop->priv->symbol && !ibus_text_get_is_static (prop->priv->symbol)) {
++    if (prop->priv->symbol) {
+         g_object_unref (prop->priv->symbol);
+     }
+ 
+@@ -594,8 +593,10 @@ ibus_property_set_symbol (IBusProperty *prop,
+         prop->priv->symbol = ibus_text_new_from_static_string ("");
+     }
+     else {
+-        prop->priv->symbol = g_object_ref_sink (symbol);
++        prop->priv->symbol = symbol;
+     }
++
++    g_object_ref_sink (prop->priv->symbol);
+ }
+ 
+ void
+@@ -615,7 +616,7 @@ ibus_property_set_tooltip (IBusProperty *prop,
+     g_assert (IBUS_IS_PROPERTY (prop));
+     g_assert (tooltip == NULL || IBUS_IS_TEXT (tooltip));
+ 
+-    if (prop->priv->tooltip && !ibus_text_get_is_static (prop->priv->tooltip)) {
++    if (prop->priv->tooltip) {
+         g_object_unref (prop->priv->tooltip);
+     }
+ 
+@@ -624,8 +625,9 @@ ibus_property_set_tooltip (IBusProperty *prop,
+     }
+     else {
+         prop->priv->tooltip = tooltip;
+-        g_object_ref_sink (prop->priv->tooltip);
+     }
++
++    g_object_ref_sink (prop->priv->tooltip);
+ }
+ 
+ void
+-- 
+2.34.1
+
 From 1b5b9548ad418765717ce1fbdc70b3f3eaae67fc Mon Sep 17 00:00:00 2001
 From: fujiwarat <takao.fujiwara1@gmail.com>
 Date: Mon, 14 Mar 2022 14:25:10 +0900

diff --git a/ibus.spec b/ibus.spec
index 8717311..47573f5 100644
--- a/ibus.spec
+++ b/ibus.spec
@@ -39,7 +39,7 @@
 
 Name:           ibus
 Version:        1.5.26
-Release:        2%{?dist}
+Release:        3%{?dist}
 Summary:        Intelligent Input Bus for Linux OS
 License:        LGPLv2+
 URL:            https://github.com/ibus/%name/wiki
@@ -521,6 +521,9 @@ dconf update || :
 %{_datadir}/installed-tests/ibus
 
 %changelog
+* Thu Mar 31 2022 Takao Fujiwara <tfujiwar@redhat.com> - 1.5.26-3
+- Fix refcounting issues in IBusText & IBusProperty
+
 * Mon Mar 28 2022 Takao Fujiwara <tfujiwar@redhat.com> - 1.5.26-2
 - Update ibus-desktop-testing-runner to always run ibus-daemon directly
 

                 reply	other threads:[~2026-05-31  2:07 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=178019326951.1.3058504036612900225.rpms-ibus-dfb5d9acdb2c@fedoraproject.org \
    --to=tfujiwar@redhat.com \
    --cc=git-commits@fedoraproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox