Package: tangogps
Version: 0.9.6-5
Severity: serious
Tags: patch

Hello,

tangogps segfaults when I try to load a log file.

I've recompiled it with "-O0 -g" to get a backtrace:

+++++++++++++++++++++++++++++++++++++++++++ 
/home/enrico/.tangogps/Maps/20090721_181312.log 

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7f3f79225780 (LWP 25051)]
0x00007f3f75c429bc in ?? () from /lib/libc.so.6
(gdb) where
#0  0x00007f3f75c429bc in ?? () from /lib/libc.so.6
#1  0x0000000000433597 in tracks_on_file_button_release_event (widget=0xb3ac90, 
event=0xa868f0, user_data=0xae3990)
    at tracks.c:146
#2  0x00007f3f78c88958 in ?? () from /usr/lib/libgtk-x11-2.0.so.0
#3  0x00007f3f76f7911d in g_closure_invoke () from /usr/lib/libgobject-2.0.so.0
#4  0x00007f3f76f8cc2b in ?? () from /usr/lib/libgobject-2.0.so.0
#5  0x00007f3f76f8dead in g_signal_emit_valist () from 
/usr/lib/libgobject-2.0.so.0
#6  0x00007f3f76f8e4f3 in g_signal_emit () from /usr/lib/libgobject-2.0.so.0
#7  0x00007f3f78d9098e in ?? () from /usr/lib/libgtk-x11-2.0.so.0
#8  0x00007f3f78c811f3 in gtk_propagate_event () from 
/usr/lib/libgtk-x11-2.0.so.0
#9  0x00007f3f78c82313 in gtk_main_do_event () from /usr/lib/libgtk-x11-2.0.so.0
#10 0x00007f3f77ff5cbc in ?? () from /usr/lib/libgdk-x11-2.0.so.0
#11 0x00007f3f76adef7a in g_main_context_dispatch () from 
/usr/lib/libglib-2.0.so.0
#12 0x00007f3f76ae2640 in ?? () from /usr/lib/libglib-2.0.so.0
#13 0x00007f3f76ae2b0d in g_main_loop_run () from /usr/lib/libglib-2.0.so.0
#14 0x00007f3f78c82727 in gtk_main () from /usr/lib/libgtk-x11-2.0.so.0
#15 0x0000000000409780 in main (argc=1, argv=0x7fff813646e8) at main.c:62
(gdb) 

The problem is here (src/tracks.c):

        arr = g_strsplit(line, ",", 2);
        lat_tmp = atof(arr[0]);
        lon_tmp = atof(arr[1]);

g_strsplit returns a NULL-terminated array. If the string contains no
commas, arr[1] will be NULL. If the string is empty, arr[0] will also be
NULL. These should be checked.

In my case, the log file was truncated (maybe the openmoko ran out of
battery, whatever) and it ends with:

  [...]
  39.467490,-6.369044,438.5,0.9,192.5,1.6,2009-07-21T21:52:33Z
  39.467490,-6.369044,438.5,0.9,192.5,1.6,2009-07-21T21:52:33Z
  39.467468,-6.369055,438.4,2.1,206.1,1.6,2009-07-21T21:52:35Z
  39.46746

The last line obviosuly trigger the issue.

The fix is just adding, after g_strsplit, something like this:

  // Drop corrupted or incomplete lines
  if (arr[0] == NULL || arr[1] == NULL) continue;

I made a patch and I have tested it. Please find it attached.


Ciao,

Enrico

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

Kernel: Linux 2.6.29-2-amd64 (SMP w/2 CPU cores)
Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash

Versions of packages tangogps depends on:
ii  libatk1.0-0                  1.26.0-1    The ATK accessibility toolkit
ii  libc6                        2.9-12      GNU C Library: Shared libraries
ii  libcairo2                    1.8.6-2+b1  The Cairo 2D vector graphics libra
ii  libcurl3-gnutls              7.19.5-1    Multi-protocol file transfer libra
ii  libexif12                    0.6.17-1    library to parse EXIF files
ii  libfontconfig1               2.6.0-4     generic font configuration library
ii  libfreetype6                 2.3.9-4.1   FreeType 2 font engine, shared lib
ii  libgconf2-4                  2.26.2-1    GNOME configuration database syste
ii  libglib2.0-0                 2.20.1-2    The GLib library of C routines
ii  libgtk2.0-0                  2.16.1-2    The GTK+ graphical user interface 
ii  libpango1.0-0                1.24.0-3+b1 Layout and rendering of internatio
ii  libsqlite3-0                 3.6.14.2-1  SQLite 3 shared library

Versions of packages tangogps recommends:
ii  gpsd                          2.39-2     GPS (Global Positioning System) da

Versions of packages tangogps suggests:
ii  python                        2.5.4-2    An interactive high-level object-o

-- no debconf information
diff -Naur tangogps-0.9.6.old/src/tracks.c tangogps-0.9.6/src/tracks.c
--- tangogps-0.9.6.old/src/tracks.c	2009-02-05 00:54:27.000000000 +0100
+++ tangogps-0.9.6/src/tracks.c	2009-07-23 16:37:37.000000000 +0200
@@ -139,7 +139,7 @@
 		trackpoint_t *tp = g_new0(trackpoint_t,1);
 		
 		arr = g_strsplit(line, ",", 2);
-		
+		if (arr[0] == NULL || arr[1] == NULL) continue;
 		
 		
 		lat_tmp = atof(arr[0]);

Reply via email to