aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJens Granseuer <jensg@src.gnome.org>2008-02-29 06:13:49 +0800
committerJens Granseuer <jensg@src.gnome.org>2008-02-29 06:13:49 +0800
commit95918bcefecf6f1454273751c6a908563356085f (patch)
treea9bfc8eadcb4ce0bac8acce9f90988be755febdb
parent2a59317dbd2fe3be837263157e84e3a0e01707d5 (diff)
downloadgsoc2013-epiphany-95918bcefecf6f1454273751c6a908563356085f.tar.gz
gsoc2013-epiphany-95918bcefecf6f1454273751c6a908563356085f.tar.zst
gsoc2013-epiphany-95918bcefecf6f1454273751c6a908563356085f.zip
Strip anchors from URIs before trying to turn them into a GFile, and properly
handle get_file_info failing. Fixes a crash when using URLs like file:///path#anchor. Bug #519370. svn path=/trunk/; revision=8002
-rw-r--r--embed/ephy-base-embed.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/embed/ephy-base-embed.c b/embed/ephy-base-embed.c
index 802f8c15e..5c2f506e5 100644
--- a/embed/ephy-base-embed.c
+++ b/embed/ephy-base-embed.c
@@ -1372,6 +1372,8 @@ ephy_base_embed_update_file_monitor (EphyBaseEmbed *embed,
{
EphyBaseEmbedPrivate *priv = embed->priv;
gboolean local;
+ gchar *anchor;
+ gchar *url;
GFile *file;
GFileType file_type;
GFileInfo *file_info;
@@ -1388,11 +1390,25 @@ ephy_base_embed_update_file_monitor (EphyBaseEmbed *embed,
local = g_str_has_prefix (address, "file://");
if (local == FALSE) return;
-
- file = g_file_new_for_uri (address);
+
+ /* strip off anchors */
+ anchor = strchr (address, '#');
+ if (anchor != NULL) {
+ url = g_strndup (address, anchor - address);
+ } else {
+ url = g_strdup (address);
+ }
+
+ file = g_file_new_for_uri (url);
file_info = g_file_query_info (file,
G_FILE_ATTRIBUTE_STANDARD_TYPE,
0, NULL, NULL);
+ if (file_info == NULL) {
+ g_object_unref (file);
+ g_free (url);
+ return;
+ }
+
file_type = g_file_info_get_file_type (file_info);
g_object_unref (file_info);
@@ -1402,7 +1418,7 @@ ephy_base_embed_update_file_monitor (EphyBaseEmbed *embed,
G_CALLBACK (ephy_base_embed_file_monitor_cb),
embed);
priv->monitor_directory = TRUE;
- LOG ("Installed monitor for directory '%s'", address);
+ LOG ("Installed monitor for directory '%s'", url);
}
else if (file_type == G_FILE_TYPE_REGULAR) {
monitor = g_file_monitor_file (file, 0, NULL, NULL);
@@ -1410,10 +1426,11 @@ ephy_base_embed_update_file_monitor (EphyBaseEmbed *embed,
G_CALLBACK (ephy_base_embed_file_monitor_cb),
embed);
priv->monitor_directory = FALSE;
- LOG ("Installed monitor for file '%s'", address);
+ LOG ("Installed monitor for file '%s'", url);
}
priv->monitor = monitor;
g_object_unref (file);
+ g_free (url);
}
void