launchbar, etc: fix segfault
authorHenry Gebhardt <hsggebhardt@gmail.com>
Sat, 27 Jul 2013 15:16:59 +0000 (11:16 -0400)
committerHenry Gebhardt <hsggebhardt@gmail.com>
Sat, 27 Jul 2013 15:16:59 +0000 (11:16 -0400)
Thanks Sharon Kimble for reporting, for lxpanel-0.5.10:

    gdb lxpanel
    GNU gdb (GDB) 7.6 (Debian 7.6-5)
    Copyright (C) 2013 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later
    <http://gnu.org/licenses/gpl.html> This is free software: you are free
    to change and redistribute it. There is NO WARRANTY, to the extent
    permitted by law.  Type "show copying" and "show warranty" for details.
    This GDB was configured as "i486-linux-gnu".
    For bug reporting instructions, please see:
    <http://www.gnu.org/software/gdb/bugs/>...
    Reading symbols from /usr/bin/lxpanel...Reading symbols
    from /usr/lib/debug/.build-id/79/50612c6c55b308d2e55497e7d988531e76c8ad.debug...done.
    done. (gdb) run --log 5 --profile LXDE
    Starting program: /usr/bin/lxpanel --log 5 --profile LXDE
    warning: Could not load shared library symbols for linux-gate.so.1.
    Do you need "set solib-search-path" or "set sysroot"?
    [Thread debugging using libthread_db enabled]
    Using host libthread_db library
    "/lib/i386-linux-gnu/i686/cmov/libthread_db.so.1". tray: another
    systray already running

    Program received signal SIGSEGV, Segmentation fault.
    translate_exec_to_cmd (exec=0x0, icon=0x0, title=0x0,
fpath=0x8161650
    "/home/boudiccas/.local/share/applications/lxde-logout.desktop") at
    misc.c:1196 1196        misc.c: No such file or directory. (gdb) ^CQuit
    (gdb) bt full
    #0  translate_exec_to_cmd (exec=0x0, icon=0x0, title=0x0,
fpath=0x8161650
    "/home/boudiccas/.local/share/applications/lxde-logout.desktop") at
    misc.c:1196 cmd = <optimized out>
    #1  0x080651d6 in
    launchbutton_build_gui (btn=btn@entry=0x81613d0, p=0x815dfb8,
    p=0x815dfb8) at launchbar.c:285 exec = <optimized out>
    icon = 0x0
    title = 0x0
    desktop = 0x808cef0
    desktop_file = 0x8161650
    "/home/boudiccas/.local/share/applications/lxde-logout.desktop" loaded
    = <optimized out> lb = 0x8161328
    button = <optimized out>
    #2  0x0806563e in launchbutton_constructor (fp=0xbffff0dc, p=0x815dfb8)
at launchbar.c:396
    btn = 0x81613d0
    s = {num = 51, len = 256, type = 2,
      str =
    "}\000\000
    }\n\000out.desktop\000\000ut.desktop\n\000op\n\000\214\357\377\277\370\311\016\b\005\000\000\000\210\370\372\26
    7ݔ\223\267\370\311\016\bd\177\244\267%\002\000\000\364_\246\267\370\311\016\bH${\267\000\000\000\000\211\227\24
    2\267\020\000\000\000P\000\000\000\n\000\000\000\210\370\372\267\3---Type
    <return> to continue, or q <return> to quit---q Quit (gdb) quit
    A debugging session is active.

    Inferior 1 [process 5934] will be killed.

    Quit anyway? (y or n) y

src/misc.c
src/plugins/launchbar.c

index ad58c11..d56f7e6 100644 (file)
@@ -1193,6 +1193,8 @@ char* translate_exec_to_cmd( const char* exec, const char* icon,
                              const char* title, const char* fpath )
 {
     GString* cmd = g_string_sized_new( 256 );
+    if (!exec)
+           return NULL;
     for( ; *exec; ++exec )
     {
         if( G_UNLIKELY(*exec == '%') )
@@ -1203,7 +1205,10 @@ char* translate_exec_to_cmd( const char* exec, const char* icon,
             switch( *exec )
             {
                 case 'c':
-                    g_string_append( cmd, title );
+                    if( title )
+                    {
+                        g_string_append( cmd, title );
+                    }
                     break;
                 case 'i':
                     if( icon )
@@ -1213,12 +1218,13 @@ char* translate_exec_to_cmd( const char* exec, const char* icon,
                     }
                     break;
                 case 'k':
-                {
-                    char* uri = g_filename_to_uri( fpath, NULL, NULL );
-                    g_string_append( cmd, uri );
-                    g_free( uri );
+                    if( fpath )
+                    {
+                        char* uri = g_filename_to_uri( fpath, NULL, NULL );
+                        g_string_append( cmd, uri );
+                        g_free( uri );
+                    }
                     break;
-                }
                 case '%':
                     g_string_append_c( cmd, '%' );
                     break;
index 07a2cb2..16e3a3c 100644 (file)
@@ -263,6 +263,12 @@ static void launchbutton_drag_data_received_event(
     guint time,
     LaunchButton * b)
 {
+    if (!b->action)
+    {
+        LOG_WARN("launchbar: Button '%s' has no action (%s)\n",
+                b->desktop_id, b->action);
+        return;
+    }
 #if GTK_CHECK_VERSION(2,14,0)
     if (gtk_selection_data_get_length(sd) > 0)
 #else