From f5dd1f9ab512399f2f9ca316807c4380320a96f6 Mon Sep 17 00:00:00 2001 From: Alexander Strasser Date: Sun, 13 May 2012 23:13:37 +0200 Subject: [PATCH] midori_view_set_uri: Work-around about:version crash On some systems (e.g. x86_64 linux) midori crashes when trying to visit "about:version". The crash happens in some printf function deeper in the call stack. But I have a theory that much stack space is occupied already before calling g_strdup_printf. I have not analyzed the situation more closely. This fixes the crash by splitting the generation of the version information page into multiple calls. If my theory is correct, it should now only work because I reduced peak stack usage. --- midori/midori-view.c | 98 ++++++++++++++++++++++++++------------------ 1 file changed, 59 insertions(+), 39 deletions(-) diff --git a/midori/midori-view.c b/midori/midori-view.c index aa49de77..934b68bb 100644 --- a/midori/midori-view.c +++ b/midori/midori-view.c @@ -4315,45 +4315,22 @@ midori_view_set_uri (MidoriView* view, WebKitWebFrame* web_frame = webkit_web_view_get_main_frame (WEBKIT_WEB_VIEW (view->web_view)); JSContextRef js_context = webkit_web_frame_get_global_context (web_frame); gchar* video_formats = list_video_formats (js_context); - GString* more = g_string_new (""); - list_netscape_plugins (more, js_context); - list_about_uris (more); - katze_assign (view->uri, g_strdup (uri)); - data = g_strdup_printf ( - "about:version" - "

about:version

" - "

%s

" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "
Command line%s
Midori%s (%s)
WebKitGTK+%d.%d.%d (%d.%d.%d)
GTK+%d.%d.%d (%d.%d.%d)
Glib%d.%d.%d (%d.%d.%d)
libsoup%s
cairo%s (%s)
granite%s
libnotify%s
single instance%s
Platform%s %s %s
Identification%s
Video Formats%s
" - "%s" - "", - _("Version numbers in brackets show the version used at runtime."), - command_line, - PACKAGE_VERSION, midori_app_get_name (NULL), - WEBKIT_MAJOR_VERSION, WEBKIT_MINOR_VERSION, WEBKIT_MICRO_VERSION, - webkit_major_version (), - webkit_minor_version (), - webkit_micro_version (), - GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION, - gtk_major_version, gtk_minor_version, gtk_micro_version, - GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION, - glib_major_version, glib_minor_version, glib_micro_version, + /* FIXME: This is for workarounding a crash deeper down the callstack on some systems. */ + static char const * const version_format_strings[] = { + "libsoup%s", + "cairo%s ", + "(%s)", + "granite%s", + "libnotify%s", + "single instance%s", + "Platform%s ", + "%s ", + "%s", + "Identification%s", + "Video Formats%s", + }; + char const * version_strings[] = { LIBSOUP_VERSION, CAIRO_VERSION_STRING, cairo_version_string (), GRANITE_VERSION, @@ -4368,7 +4345,50 @@ midori_view_set_uri (MidoriView* view, "Sockets", #endif platform, sys_name, architecture ? architecture : "", ident, - video_formats, (gchar*)(more->str)); + video_formats, + }; + int i = 0; + GString * tmp = g_string_new("");; + + GString* more = g_string_new (""); + list_netscape_plugins (more, js_context); + list_about_uris (more); + + katze_assign (view->uri, g_strdup (uri)); + g_string_append_printf (tmp, + "about:version" + "

about:version

" + "

%s

" + "" + "" + "" + "" + "" + "" + "", + _("Version numbers in brackets show the version used at runtime."), + command_line, + PACKAGE_VERSION, midori_app_get_name (NULL), + WEBKIT_MAJOR_VERSION, WEBKIT_MINOR_VERSION, WEBKIT_MICRO_VERSION, + webkit_major_version (), + webkit_minor_version (), + webkit_micro_version (), + GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION, + gtk_major_version, gtk_minor_version, gtk_micro_version, + GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION, + glib_major_version, glib_minor_version, glib_micro_version); + + for (i = 0; + i < sizeof (version_format_strings) / sizeof (version_format_strings[0]); + ++i) + g_string_append_printf (tmp, version_format_strings[i], version_strings[i]); + + g_string_append_printf ( + tmp, "
Command line%s
Midori%s (%s)
WebKitGTK+%d.%d.%d (%d.%d.%d)
GTK+%d.%d.%d (%d.%d.%d)
Glib%d.%d.%d (%d.%d.%d)
%s", (gchar*)(more->str)); + + data = g_string_free (tmp, FALSE); + g_free (command_line); g_free (arguments); g_free (ident);