Bug#885241: glade: Gtypes mangled when packed in pointers in glade-base-editor
William Panlener
wpanlener at gmail.com
Tue Dec 26 03:07:23 UTC 2017
Package: glade
Version: 3.20.2-1
Severity: normal
Tags: upstream patch
Dear Maintainer,
When attempting to add a cell renderer to a GTKTreeViewColumn, it was
discovered
that this feature is broken in glade.
To reproduce: Add a GTKTreeView to a GTKWindow in glade. Right click the
GTKTreeView and select "Edit" in the popup window. In the Hierarchy pane,
click
the + (plus) icon to add a new GTKTreeViewColumn. Right click the new column
and
choose "Add child Text" from the popup window.
It is expected that a GTKCellRendererText object would appear as a child of
the
GTKTreeViewColumn, but instead, nothing happens. Other buggy behavior can be
seen in this same Hierarchy pane such as occasional segfaults when removing
columns.
After debugging, it seems that this behavior and probable buggy behavior
with
other GTK+ plugins using the glade-base-editor can be attributed to mangling
of
GType values that occurs when packing these values into gints. GType is an
8-byte
unsigned value while gint is a signed 4 byte value (at least on amd64).
These patches were tested on a backport of glade from unstable (3.20.2-1) to
stretch
with libglib-dev and debhelper build-dep versions relaxed to meet those in
stretch,
the behavior bug is also present in the stable package (3.20.0-2) and
appears to be
present upstream (untested but apparent in source and unmentioned in
Changelog). The
report has not been forwarded upstream.
The patch consists of a macro wrapper to pack GTypes in a larger integer
type and a
test to preempt regression. Ideally, most of this would be provided by glib.
-- System Information:
Debian Release: 9.3
APT prefers stable
APT policy: (500, 'stable')
Architecture: amd64 (x86_64)
Foreign Architectures: i386
Kernel: Linux 4.9.0-4-amd64 (SMP w/8 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8),
LANGUAGE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
Versions of packages glade depends on:
ii libc6 2.24-11+deb9u1
ii libcairo2 1.14.8-1
ii libgdk-pixbuf2.0-0 2.36.5-2+deb9u1
ii libgladeui-2-6 3.20.2-1
ii libglib2.0-0 2.50.3-2
ii libgtk-3-0 3.22.11-1
ii libpango-1.0-0 1.40.5-1
Versions of packages glade recommends:
ii devhelp 3.22.0-1+b1
ii libgtk-3-dev 3.22.11-1
glade suggests no packages.
-- no debconf information
*** /home/william/Desktop/glade-bug/Avoid_data_loss_when_packing_gtype.patch
Description: Avoid data loss when packing GType
Gtypes are unsigned longs but were packed into a
signed int causing data loss and undesirable
behavior in the tree view editor and likely
all other gtk plugins utilizing glade-base-editor.
.
glade (3.20.0-2) stable; urgency=medium
.
Author: William Panlener <wpanlener at gmail.com>
Bug-Debian: https://bugs.debian.org/837832
---
Bug-Debian: https://bugs.debian.org/<bugnumber>
Forwarded: <no>
Last-Update: 2017-12-25
--- glade-3.20.0.orig/gladeui/glade-base-editor.c
+++ glade-3.20.0/gladeui/glade-base-editor.c
@@ -784,7 +784,7 @@ glade_base_editor_add_item_activate (Gtk
GladeBaseEditor *e)
{
GObject *item = G_OBJECT (menuitem);
- GType type = GPOINTER_TO_INT (g_object_get_data (item, "object_type"));
+ GType type = GPOINTER_TO_TYPE (g_object_get_data (item, "object_type"));
GladeBaseEditorAddMode add_mode =
GPOINTER_TO_INT (g_object_get_data (item, "object_add_mode"));
@@ -825,7 +825,7 @@ glade_base_editor_popup (GladeBaseEditor
gtk_widget_show (item);
g_object_set_data (G_OBJECT (item), "object_type",
- GINT_TO_POINTER (iter_type));
+ GTYPE_TO_POINTER (iter_type));
g_object_set_data (G_OBJECT (item), "object_add_mode",
GINT_TO_POINTER (ADD_SIBLING));
@@ -857,7 +857,7 @@ glade_base_editor_popup (GladeBaseEditor
gtk_widget_show (item);
g_object_set_data (G_OBJECT (item), "object_type",
- GINT_TO_POINTER (iter_type));
+ GTYPE_TO_POINTER (iter_type));
g_object_set_data (G_OBJECT (item), "object_add_mode",
GINT_TO_POINTER (ADD_CHILD));
--- glade-3.20.0.orig/gladeui/glade-base-editor.h
+++ glade-3.20.0/gladeui/glade-base-editor.h
@@ -34,6 +34,9 @@ G_BEGIN_DECLS
#define GLADE_IS_BASE_EDITOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k),
GLADE_TYPE_BASE_EDITOR))
#define GLADE_BASE_EDITOR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o),
GLADE_TYPE_BASE_EDITOR, GladeBaseEditorClass))
+#define GTYPE_TO_POINTER(x) GSIZE_TO_POINTER(x)
+#define GPOINTER_TO_TYPE(x) GPOINTER_TO_SIZE(x)
+
typedef struct _GladeBaseEditor GladeBaseEditor;
typedef struct _GladeBaseEditorPrivate GladeBaseEditorPrivate;
typedef struct _GladeBaseEditorClass GladeBaseEditorClass;
--- glade-3.20.0.orig/tests/Makefile.am
+++ glade-3.20.0/tests/Makefile.am
@@ -3,6 +3,7 @@ include $(top_srcdir)/glade-rules.mk
TEST_PROGS = \
create-widgets \
add-child \
+ misc \
toplevel-order
noinst_PROGRAMS = $(TEST_PROGS)
@@ -40,6 +41,13 @@ add_child_LDFLAGS = $(progs_libs)
add_child_LDADD = $(progs_ldadd)
add_child_SOURCES = add-child.c
+# Test miscellaneous conditions
+misc_CPPFLAGS = $(progs_cppflags)
+misc_CFLAGS = $(progs_cflags)
+misc_LDFLAGS = $(progs_libs)
+misc_LDADD = $(progs_ldadd)
+misc_SOURCES = misc.c
+
TOPLEVEL_ORDER_FILES = \
toplevel-order-resources.gresource.xml \
toplevel_order_test.glade \
--- /dev/null
+++ glade-3.20.0/tests/misc.c
@@ -0,0 +1,30 @@
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+#include <gladeui/glade-base-editor.h>
+
+static void
+test_pack_gtype (void)
+{
+ GType a, b;
+
+ /* Intentional underflow to get largest possible integer */
+ a = -1;
+ a = (a >> 1);
+
+ b = GPOINTER_TO_TYPE(GTYPE_TO_POINTER(a));
+
+ g_assert (a == b);
+}
+
+int
+main (int argc,
+ char *argv[])
+{
+ gtk_test_init (&argc, &argv, NULL);
+
+ g_test_add_func("/misc/pack_gtype", test_pack_gtype);
+
More information about the pkg-gnome-maintainers
mailing list