From abc69427fc9985f6bc1ebe9a14d645f4805deca4 Mon Sep 17 00:00:00 2001 From: Ondrej Holy <oholy@redhat.com> Date: Wed, 21 Jan 2015 16:34:00 +0100 Subject: dav: don't unescape the uri twice path_equal tries to unescape path before comparing. Unfortunately this function is used also for already unescaped paths. Therefore unescaping can fail. This commit reverts changes which was done in commit 50af53d and unescape just uris, which aren't unescaped yet. https://bugzilla.gnome.org/show_bug.cgi?id=743298 --- daemon/gvfsbackenddav.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/daemon/gvfsbackenddav.c b/daemon/gvfsbackenddav.c index 36a730d..25b28bf 100644 --- a/daemon/gvfsbackenddav.c +++ b/daemon/gvfsbackenddav.c @@ -230,7 +230,6 @@ path_equal (const char *a, const char *b, gboolean relax) { gboolean res; size_t a_len, b_len; - char *ua, *ub; if (relax == FALSE) return str_equal (a, b, FALSE); @@ -238,26 +237,20 @@ path_equal (const char *a, const char *b, gboolean relax) if (a == NULL || b == NULL) return a == b; - ua = g_uri_unescape_string (a, "/"); - ub = g_uri_unescape_string (b, "/"); - - a_len = strlen (ua); - b_len = strlen (ub); + a_len = strlen (a); + b_len = strlen (b); - while (a_len > 0 && ua[a_len - 1] == '/') + while (a_len > 0 && a[a_len - 1] == '/') a_len--; - while (b_len > 0 && ub[b_len - 1] == '/') + while (b_len > 0 && b[b_len - 1] == '/') b_len--; if (a_len == b_len) - res = ! strncmp (ua, ub, a_len); + res = ! strncmp (a, b, a_len); else res = FALSE; - g_free(ua); - g_free(ub); - return res; } @@ -266,13 +259,20 @@ static gboolean dav_uri_match (SoupURI *a, SoupURI *b, gboolean relax) { gboolean diff; + char *ua, *ub; + + ua = g_uri_unescape_string (a->path, "/"); + ub = g_uri_unescape_string (b->path, "/"); diff = a->scheme != b->scheme || a->port != b->port || ! str_equal (a->host, b->host, TRUE) || - ! path_equal (a->path, b->path, relax) || + ! path_equal (ua, ub, relax) || ! str_equal (a->query, b->query, FALSE) || ! str_equal (a->fragment, b->fragment, FALSE); + g_free (ua); + g_free (ub); + return !diff; } -- cgit v0.11.2