Control: reassign -1 libvte-2.91-0 0.78.2-1
Control: affects -1 src:terminator
Control: tag -1 patch

On Wed, Jan 08, 2025 at 08:41:46PM +0100, Lucas Nussbaum wrote:
> During a rebuild of all packages in sid, your package failed to build
> on amd64.
> 
> 
> Relevant part (hopefully):
> > make[1]: Entering directory '/build/reproducible-path/terminator-2.1.4'
> > xvfb-run dh_auto_test
> > I: pybuild base:311: cd 
> > /build/reproducible-path/terminator-2.1.4/.pybuild/cpython3_3.13/build; 
> > python3.13 -m pytest --doctest-modules
> > ============================= test session starts 
> > ==============================
> > platform linux -- Python 3.13.1, pytest-8.3.4, pluggy-1.5.0 -- 
> > /usr/bin/python3.13
> > cachedir: .pytest_cache
> > rootdir: 
> > /build/reproducible-path/terminator-2.1.4/.pybuild/cpython3_3.13/build
> > configfile: pytest.ini
> > plugins: typeguard-4.4.1
> > collecting ... collected 27 items / 1 error
> > 
> > ==================================== ERRORS 
> > ====================================
> > ___________ ERROR collecting terminatorlib/plugins/command_notify.py 
> > ___________
> > TypeError: <Vte.Terminal object at 0x7f7c4dc6a1c0 (VteTerminal at 
> > 0x18c1370)>: unknown signal name: notification-received
> > 
> > The above exception was the direct cause of the following exception:
> > TypeError: <Vte.Terminal object at 0x7f7c4dc6a1c0 (VteTerminal at 
> > 0x18c1370)>: unknown signal name: notification-received
> > 
> > The above exception was the direct cause of the following exception:
> > 
> > SystemError: <class 'gobject.Warning'> returned a result with an exception 
> > set
> > 
> > The above exception was the direct cause of the following exception:
> > terminatorlib/plugins/command_notify.py:26: in <module>
> >     Vte.Terminal().connect('notification-received',lambda *args: None,None)
> > E   SystemError: <class 'gobject.Warning'> returned a result with an 
> > exception set

I tracked this down to what I think is a vte2.91 bug.

With python3.13-dbg and a local vte2.91 build to get me some debug
symbols, the top of the traceback looks like this:

  Thread 1 "python3.13-dbg" received signal SIGABRT, Aborted.
  0x00007ffff7d25d8c in ?? () from /lib/x86_64-linux-gnu/libc.so.6
  (gdb) bt
  #0  0x00007ffff7d25d8c in ??? () at /lib/x86_64-linux-gnu/libc.so.6
  #1  0x00007ffff7cd1d02 in raise () at /lib/x86_64-linux-gnu/libc.so.6
  #2  0x00007ffff7cba4f0 in abort () at /lib/x86_64-linux-gnu/libc.so.6
  #3  0x00007ffff7cba418 in ??? () at /lib/x86_64-linux-gnu/libc.so.6
  #4  0x00007ffff7cca612 in __assert_fail () at /lib/x86_64-linux-gnu/libc.so.6
  #5  0x000000000053a663 in type_call (self=self@entry=<type at remote 
0x11a0e80>, args=args@entry=('invalid (NULL) pointer instance',), 
kwds=kwds@entry=0x0)
      at ../Objects/typeobject.c:1950
  #6  0x00000000004b93f8 in _PyObject_MakeTpCall
      (tstate=tstate@entry=0xaf9de0 <_PyRuntime+299040>, 
callable=callable@entry=<type at remote 0x11a0e80>, 
args=args@entry=0x7fffffffc788, nargs=<optimized out>, 
keywords=keywords@entry=0x0) at ../Objects/call.c:242
  #7  0x00000000004b960b in _PyObject_VectorcallTstate
      (tstate=0xaf9de0 <_PyRuntime+299040>, callable=callable@entry=<type at 
remote 0x11a0e80>, args=args@entry=0x7fffffffc788, nargsf=<optimized out>,
      nargsf@entry=9223372036854775809, kwnames=kwnames@entry=0x0) at 
../Include/internal/pycore_call.h:166
  #8  0x00000000004b96a2 in PyObject_CallOneArg (func=func@entry=<type at 
remote 0x11a0e80>, arg=arg@entry='invalid (NULL) pointer instance') at 
../Objects/call.c:395
  #9  0x000000000058c5f2 in warn_explicit
      (tstate=tstate@entry=0xaf9de0 <_PyRuntime+299040>, 
category=category@entry=<type at remote 0x11a0e80>, 
message=message@entry='invalid (NULL) pointer instance', 
filename='/build/reproducible-path/terminator-2.1.4/.pybuild/cpython3_3.13/build/terminatorlib/plugins/command_notify.py',
 lineno=26, module='terminatorlib.plugins.command_notify', registry={}, 
sourceline=0x0, source=0x0) at ../Python/_warnings.c:666
  #10 0x000000000058ca2b in do_warn
      (message='invalid (NULL) pointer instance', category=<type at remote 
0x11a0e80>, stack_level=1, source=0x0, 
skip_file_prefixes=skip_file_prefixes@entry=0x0)
      at ../Python/_warnings.c:1002
  #11 0x000000000058caa1 in warn_unicode (category=<optimized out>,
      category@entry=<type at remote 0x11a0e80>, message=message@entry='invalid 
(NULL) pointer instance', stack_level=stack_level@entry=1, 
source=source@entry=0x0)
      at ../Python/_warnings.c:1202
  #12 0x000000000058d5c4 in PyErr_WarnEx (category=<type at remote 0x11a0e80>, 
text=<optimized out>, stack_level=1) at ../Python/_warnings.c:1275
  #13 0x00007ffff5a1122b in ??? () at 
/usr/lib/python3/dist-packages/gi/_gi.cpython-313-x86_64-linux-gnu.so
  #14 0x00007ffff590a5eb in g_logv () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
  #15 0x00007ffff590a943 in g_log () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
  #16 0x00007ffff5845aba in g_type_check_instance () at 
/lib/x86_64-linux-gnu/libgobject-2.0.so.0
  #17 0x00007ffff583aed8 in g_signal_handlers_disconnect_matched () at 
/lib/x86_64-linux-gnu/libgobject-2.0.so.0
  #18 0x00007fffe43be49b in vte::platform::Widget::~Widget (this=0x15ac210, 
__in_chrg=<optimized out>) at ../src/widget.cc:603
  #19 0x00007fffe43642d7 in 
std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release_last_use 
(this=0x15ac200) at /usr/include/c++/14/bits/shared_ptr_base.h:175
  #20 
std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release_last_use_cold 
(this=0x15ac200) at /usr/include/c++/14/bits/shared_ptr_base.h:199
  #21 0x00007fffe439fbc8 in 
std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release (this=0x15ac200) 
at /usr/include/c++/14/bits/shared_ptr_base.h:353
  #22 std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count 
(this=<optimized out>, __in_chrg=<optimized out>) at 
/usr/include/c++/14/bits/shared_ptr_base.h:1069
  #23 std::__shared_ptr<vte::platform::Widget, 
(__gnu_cxx::_Lock_policy)2>::~__shared_ptr (this=<optimized out>, 
__in_chrg=<optimized out>)
      at /usr/include/c++/14/bits/shared_ptr_base.h:1525
  #24 std::__shared_ptr<vte::platform::Widget, 
(__gnu_cxx::_Lock_policy)2>::reset (this=0x134af90) at 
/usr/include/c++/14/bits/shared_ptr_base.h:1643
  #25 VteTerminalPrivate::reset (this=0x134af90) at ../src/vtegtk.cc:193
  #26 vte_terminal_dispose (object=0x134b090) at ../src/vtegtk.cc:1015
  #27 0x00007ffff5825279 in g_object_unref () at 
/lib/x86_64-linux-gnu/libgobject-2.0.so.0
  #28 0x00007ffff5a0a74d in ??? () at 
/usr/lib/python3/dist-packages/gi/_gi.cpython-313-x86_64-linux-gnu.so
  #29 0x000000000053b955 in subtype_dealloc (self=<Terminal at remote 
0x7fffe44582f0>) at ../Objects/typeobject.c:2384
  #30 0x00000000005098ae in _Py_Dealloc (op=op@entry=<Terminal at remote 
0x7fffe44582f0>) at ../Objects/object.c:2935
  #31 0x00000000005caef9 in Py_DECREF (filename=filename@entry=0x7629e3 
"../Python/generated_cases.c.h", lineno=lineno@entry=837, op=<Terminal at 
remote 0x7fffe44582f0>)
      at ../Include/object.h:934
  #32 0x00000000005d1fbf in _PyEval_EvalFrameDefault (tstate=0xaf9de0 
<_PyRuntime+299040>, frame=0x7ffff7ad27d8, throwflag=0) at 
../Python/generated_cases.c.h:837
  [...]

I believe the bug is in vte::platform::Widget::~Widget: it's passing a
null instance to g_signal_handlers_disconnect_matched, which is
reasonably complaining.  This patch against upstream gets terminator's
tests to pass.

diff --git a/src/widget.cc b/src/widget.cc
index 66955a60..0daaed1e 100644
--- a/src/widget.cc
+++ b/src/widget.cc
@@ -600,10 +600,12 @@ Widget::Widget(VteTerminal* t)
 Widget::~Widget() noexcept
 try
 {
-        g_signal_handlers_disconnect_matched(m_settings.get(),
-                                             G_SIGNAL_MATCH_DATA,
-                                             0, 0, NULL, NULL,
-                                             this);
+        if (m_settings) {
+                g_signal_handlers_disconnect_matched(m_settings.get(),
+                                                     G_SIGNAL_MATCH_DATA,
+                                                     0, 0, NULL, NULL,
+                                                     this);
+        }
 
         if (m_vadjustment) {
                 g_signal_handlers_disconnect_by_func(m_vadjustment.get(),

I haven't contributed this upstream yet because my gitlab.gnome.org
account was deactivated a couple of years ago and I need to figure out
how to get it reactivated, but once that's done I'm happy to send it
upstream.

-- 
Colin Watson (he/him)                              [cjwat...@debian.org]

Reply via email to