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.
This commit is contained in:
parent
109ed3cd92
commit
f5dd1f9ab5
1 changed files with 59 additions and 39 deletions
|
@ -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));
|
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);
|
JSContextRef js_context = webkit_web_frame_get_global_context (web_frame);
|
||||||
gchar* video_formats = list_video_formats (js_context);
|
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));
|
/* FIXME: This is for workarounding a crash deeper down the callstack on some systems. */
|
||||||
data = g_strdup_printf (
|
static char const * const version_format_strings[] = {
|
||||||
"<html><head><title>about:version</title></head>"
|
"<tr><td>libsoup</td><td>%s</td></tr>",
|
||||||
"<body><h1>about:version</h1>"
|
"<tr><td>cairo</td><td>%s ",
|
||||||
"<p>%s</p>"
|
"(%s)</td></tr>",
|
||||||
"<img src=\"res://logo-shade.png\" "
|
"<tr><td>granite</td><td>%s</td></tr>",
|
||||||
"style=\"position: absolute; right: 15px; bottom: 15px; z-index: -9;\">"
|
"<tr><td>libnotify</td><td>%s</td></tr>",
|
||||||
"<table>"
|
"<tr><td>single instance</td><td>%s</td></tr>",
|
||||||
"<tr><td>Command line</td><td>%s</td></tr>"
|
"<tr><td>Platform</td><td>%s ",
|
||||||
"<tr><td>Midori</td><td>%s (%s)</td></tr>"
|
"%s ",
|
||||||
"<tr><td>WebKitGTK+</td><td>%d.%d.%d (%d.%d.%d)</td></tr>"
|
"%s</td></tr>",
|
||||||
"<tr><td>GTK+</td><td>%d.%d.%d (%d.%d.%d)</td></tr>"
|
"<tr><td>Identification</td><td>%s</td></tr>",
|
||||||
"<tr><td>Glib</td><td>%d.%d.%d (%d.%d.%d)</td></tr>"
|
"<tr><td>Video Formats</td><td>%s</td></tr>",
|
||||||
"<tr><td>libsoup</td><td>%s</td></tr>"
|
};
|
||||||
"<tr><td>cairo</td><td>%s (%s)</td></tr>"
|
char const * version_strings[] = {
|
||||||
"<tr><td>granite</td><td>%s</td></tr>"
|
|
||||||
"<tr><td>libnotify</td><td>%s</td></tr>"
|
|
||||||
"<tr><td>single instance</td><td>%s</td></tr>"
|
|
||||||
"<tr><td>Platform</td><td>%s %s %s</td></tr>"
|
|
||||||
"<tr><td>Identification</td><td>%s</td></tr>"
|
|
||||||
"<tr><td>Video Formats</td><td>%s</td></tr>"
|
|
||||||
"</table>"
|
|
||||||
"%s"
|
|
||||||
"</body></html>",
|
|
||||||
_("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,
|
|
||||||
LIBSOUP_VERSION,
|
LIBSOUP_VERSION,
|
||||||
CAIRO_VERSION_STRING, cairo_version_string (),
|
CAIRO_VERSION_STRING, cairo_version_string (),
|
||||||
GRANITE_VERSION,
|
GRANITE_VERSION,
|
||||||
|
@ -4368,7 +4345,50 @@ midori_view_set_uri (MidoriView* view,
|
||||||
"Sockets",
|
"Sockets",
|
||||||
#endif
|
#endif
|
||||||
platform, sys_name, architecture ? architecture : "", ident,
|
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,
|
||||||
|
"<html><head><title>about:version</title></head>"
|
||||||
|
"<body><h1>about:version</h1>"
|
||||||
|
"<p>%s</p>"
|
||||||
|
"<img src=\"res://logo-shade.png\" "
|
||||||
|
"style=\"position: absolute; right: 15px; bottom: 15px; z-index: -9;\">"
|
||||||
|
"<table>"
|
||||||
|
"<tr><td>Command line</td><td>%s</td></tr>"
|
||||||
|
"<tr><td>Midori</td><td>%s (%s)</td></tr>"
|
||||||
|
"<tr><td>WebKitGTK+</td><td>%d.%d.%d (%d.%d.%d)</td></tr>"
|
||||||
|
"<tr><td>GTK+</td><td>%d.%d.%d (%d.%d.%d)</td></tr>"
|
||||||
|
"<tr><td>Glib</td><td>%d.%d.%d (%d.%d.%d)</td></tr>",
|
||||||
|
_("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, "</table>%s</body></html>", (gchar*)(more->str));
|
||||||
|
|
||||||
|
data = g_string_free (tmp, FALSE);
|
||||||
|
|
||||||
g_free (command_line);
|
g_free (command_line);
|
||||||
g_free (arguments);
|
g_free (arguments);
|
||||||
g_free (ident);
|
g_free (ident);
|
||||||
|
|
Loading…
Reference in a new issue