Package: gitg
Version: 0.2.4-1.1
Severity: important
Tags: patch

Hi!

Recently (maybe after the introduction of GTK3 in Debian), gitg has
started to crash when staging individual hunks.

Here's the backtrace. Obviously, the iter variable is not set.
Without carefully reading the source code, I came up with the attached
patch that fixes the issue for me, but maybe the upstream author wants
to have a look and propose a better solution, if any.


Cheers

PS: To ease the Debian maintainer's life, the patch already contains
some DEP-3 fields.

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff76ed660 in ?? () from /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
(gdb) bt
#0  0x00007ffff76ed660 in ?? () from /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
#1  0x00007ffff77042bc in ?? () from /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
#2  0x00007ffff7704ffb in gtk_text_iter_get_line ()
   from /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
#3  0x000000000042c5db in gitg_diff_view_get_header_at_iter (view=0x818110, 
    iter=0x8021f8, diff_iter=0x7fffffffd2a0) at gitg-diff-view.c:1404
#4  0x0000000000423976 in get_patch_header (view=0x802000, buffer=0x8431c0, 
    iter=0x8021f8) at gitg-commit-view.c:675
#5  0x0000000000423ab5 in get_hunk_patch (view=0x802000, iter=0x8021f8)
    at gitg-commit-view.c:711
#6  0x000000000042426d in handle_stage_unstage (view=0x802000, iter=0x8021f8)
    at gitg-commit-view.c:922
#7  0x0000000000427afc in on_stage_changes (action=0x7fffe8041040, 
    view=0x802000) at gitg-commit-view.c:2257
#8  0x00007ffff591c724 in g_closure_invoke ()
   from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#9  0x00007ffff592d7b0 in ?? ()
   from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#10 0x00007ffff593572c in g_signal_emit_valist ()
   from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#11 0x00007ffff59358c2 in g_signal_emit ()
   from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#12 0x00007ffff75776f3 in ?? () from /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
#13 0x00007ffff591ca03 in ?? ()
   from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#14 0x00007ffff5935076 in g_signal_emit_valist ()
   from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#15 0x00007ffff59358c2 in g_signal_emit ()
   from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#16 0x00007ffff778382c in gtk_widget_activate ()
   from /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
#17 0x00007ffff767706e in gtk_menu_shell_activate_item ()
   from /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
#18 0x00007ffff767740b in ?? () from /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
#19 0x00007ffff765c39f in ?? () from /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
#20 0x00007ffff591ca03 in ?? ()
   from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#21 0x00007ffff5935076 in g_signal_emit_valist ()
   from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#22 0x00007ffff59358c2 in g_signal_emit ()
   from /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#23 0x00007ffff778442e in ?? () from /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
#24 0x00007ffff765a305 in ?? () from /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
#25 0x00007ffff765bf73 in gtk_main_do_event ()
   from /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
#26 0x00007ffff72a5002 in ?? () from /usr/lib/x86_64-linux-gnu/libgdk-3.so.0
#27 0x00007ffff565e205 in g_main_context_dispatch ()
   from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#28 0x00007ffff565e538 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#29 0x00007ffff565e932 in g_main_loop_run ()
   from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#30 0x00007ffff765b2d5 in gtk_main ()
   from /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
#31 0x0000000000419d71 in main (argc=1, argv=0x7fffffffe498) at gitg.c:206

(gdb) frame 3
#3  0x000000000042c5db in gitg_diff_view_get_header_at_iter (view=0x818110, 
    iter=0x8021f8, diff_iter=0x7fffffffd2a0) at gitg-diff-view.c:1404
1404            ensure_scan (view, gtk_text_iter_get_line (iter));
(gdb) list
1399            if (!view->priv->diff_enabled)
1400            {
1401                    return FALSE;
1402            }
1403
1404            ensure_scan (view, gtk_text_iter_get_line (iter));
1405
1406            Region *region = find_current_region (view, 
gtk_text_iter_get_line (iter));
1407
1408            while (region && region->type == GITG_DIFF_ITER_TYPE_HUNK)
(gdb) p iter
$1 = (const GtkTextIter *) 0x8021f8
(gdb) p view
$2 = (GitgDiffView *) 0x818110
(gdb) p *iter
$3 = {dummy1 = 0x0, dummy2 = 0x0, dummy3 = 0, dummy4 = 0, dummy5 = 0, 
  dummy6 = 0, dummy7 = 0, dummy8 = 0, dummy9 = 0x0, dummy10 = 0x0, 
  dummy11 = 0, dummy12 = 0, dummy13 = 0, dummy14 = 0x0}



-- System Information:
Debian Release: wheezy/sid
  APT prefers unstable
  APT policy: (500, 'unstable'), (500, 'testing')
Architecture: amd64 (x86_64)

Kernel: Linux 3.2.2 (SMP w/8 CPU cores; PREEMPT)
Locale: LANG=C, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) (ignored: LC_ALL set to 
en_US.UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages gitg depends on:
ii  dbus-x11                                     1.5.12-1
ii  dconf-gsettings-backend [gsettings-backend]  0.12.1-1
ii  git                                          1:1.7.10-1
ii  gsettings-desktop-schemas                    3.4.2-1
ii  libatk1.0-0                                  2.4.0-2
ii  libc6                                        2.13-32
ii  libcairo-gobject2                            1.12.2-2
ii  libcairo2                                    1.12.2-2
ii  libdconf0                                    0.12.1-1
ii  libgdk-pixbuf2.0-0                           2.26.1-1
ii  libglib2.0-0                                 2.32.3-1
ii  libgtk-3-0                                   3.4.2-1
ii  libgtksourceview-3.0-0                       3.4.2-1
ii  libpango1.0-0                                1.30.0-1

gitg recommends no packages.

gitg suggests no packages.

-- no debconf information
From: Adrian Knoth <[email protected]>
Forwarded-Upstream: please_forward
Bugs-Debian: your_bts_bugnumber_goes_here
Last-Update: 2012-05-22
Description: Fix segfault when staging individual hunk
--- a/gitg/gitg-commit-view.c
+++ b/gitg/gitg-commit-view.c
@@ -2254,6 +2254,9 @@ on_stage_changes(GtkAction *action, GitgCommitView *view)
 	}
 	else
 	{
+		gboolean is_hunk;
+
+		get_info_at_pointer (view, &view->priv->context_iter, &is_hunk, NULL, NULL);
 		handle_stage_unstage(view, &view->priv->context_iter);
 	}
 }

Reply via email to