[evolution-data-server] Fix e_webdav_session_util_item_href_equal()
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] Fix e_webdav_session_util_item_href_equal()
- Date: Thu, 3 Jun 2021 13:51:32 +0000 (UTC)
commit 03fc968217cd17c3ed93785eb4dee1fe5435d135
Author: Milan Crha <mcrha redhat com>
Date: Thu Jun 3 15:48:35 2021 +0200
Fix e_webdav_session_util_item_href_equal()
There had been some issues with the compare code, which could match
two href-s, which were not equal.
src/libedataserver/e-webdav-session.c | 40 +++++++++++++++++-------------
tests/libedataserver/libedataserver-test.c | 9 ++++++-
2 files changed, 31 insertions(+), 18 deletions(-)
---
diff --git a/src/libedataserver/e-webdav-session.c b/src/libedataserver/e-webdav-session.c
index 58ba4b760..83c89f517 100644
--- a/src/libedataserver/e-webdav-session.c
+++ b/src/libedataserver/e-webdav-session.c
@@ -5176,19 +5176,20 @@ e_webdav_session_util_free_privileges (GNode *privileges)
static gint
e_webdav_session_uricmp (const gchar *str1,
+ gint len1,
const gchar *str2,
- gint len,
+ gint len2,
gboolean case_sensitive)
{
const gchar *p1, *p2;
gchar c1, c2;
- gint len1, len2;
- g_return_val_if_fail (len >= 0, -1);
g_return_val_if_fail (str1 != NULL, -1);
+ g_return_val_if_fail (len1 >= 0, -1);
g_return_val_if_fail (str2 != NULL, -1);
+ g_return_val_if_fail (len2 >= 0, -1);
- if (!len)
+ if (!len1 && !len2)
return 0;
/* Decode %-encoded letters, if needed */
@@ -5214,9 +5215,6 @@ e_webdav_session_uricmp (const gchar *str1,
p1 = str1;
p2 = str2;
- len1 = len;
- len2 = len;
-
c1 = *p1;
c2 = *p2;
@@ -5225,11 +5223,17 @@ e_webdav_session_uricmp (const gchar *str1,
get_next_char (p2, len2, c2);
if ((case_sensitive && c1 != c2) || (!case_sensitive && g_ascii_tolower (c1) !=
g_ascii_tolower (c2)))
- break;
+ return c1 - c2;
}
#undef get_next_char
+ if (!len1 || !*p1)
+ c1 = 0;
+
+ if (!len2 || !*p2)
+ c2 = 0;
+
return c1 - c2;
}
@@ -5272,7 +5276,7 @@ e_webdav_session_util_item_href_equal (const gchar *href1,
href2 = ptr + 3;
for (from1 = href1, from2 = href2; from1 && from2; from1 = next1, from2 = next2) {
- gint len;
+ gint len1, len2;
ptr = strchr (from1, '/');
if (ptr)
@@ -5287,10 +5291,8 @@ e_webdav_session_util_item_href_equal (const gchar *href1,
if ((!next1 && next2) || (next1 && !next2))
break;
- len = next1 ? next1 - from1 : strlen (from1);
-
- if (!len)
- len = next2 ? next2 - from2 : strlen (from2);
+ len1 = next1 ? next1 - from1 : strlen (from1);
+ len2 = next2 ? next2 - from2 : strlen (from2);
/* it's the hostname part */
if (from1 == href1) {
@@ -5299,17 +5301,21 @@ e_webdav_session_util_item_href_equal (const gchar *href1,
/* ignore the username/password part */
ptr = strchr (from1, '@');
dash = strchr (from1, '/');
- if (ptr && (!dash || dash > ptr))
+ if (ptr && (!dash || dash > ptr)) {
+ len1 = len1 - (ptr - from1 + 1);
from1 = ptr + 1;
+ }
ptr = strchr (from2, '@');
dash = strchr (from2, '/');
- if (ptr && (!dash || dash > ptr))
+ if (ptr && (!dash || dash > ptr)) {
+ len2 = len2 - (ptr - from2 + 1);
from2 = ptr + 1;
+ }
- if (e_webdav_session_uricmp (from1, from2, len, FALSE) != 0)
+ if (e_webdav_session_uricmp (from1, len1, from2, len2, FALSE) != 0)
return FALSE;
- } else if (e_webdav_session_uricmp (from1, from2, len, TRUE) != 0) {
+ } else if (e_webdav_session_uricmp (from1, len1, from2, len2, TRUE) != 0) {
return FALSE;
}
}
diff --git a/tests/libedataserver/libedataserver-test.c b/tests/libedataserver/libedataserver-test.c
index 084c42c25..6c321d234 100644
--- a/tests/libedataserver/libedataserver-test.c
+++ b/tests/libedataserver/libedataserver-test.c
@@ -64,7 +64,14 @@ test_webdav_href_compare (ETestServerFixture *fixture,
{ "https://www.gnome.org/path%g", "https://www.gnome.org/path%g", TRUE },
{ "https://www.gnome.org/path%ah", "https://www.gnome.org/path%ah", TRUE },
{ "https://www.gnome.org/path%32", "https://www.gnome.org/path%32", TRUE },
- { "https://www.gnome.org/path%20%2e", "https://www.gnome.org/path .", TRUE }
+ { "https://www.gnome.org/path%20%2e", "https://www.gnome.org/path .", TRUE },
+ { "https://Xww.gnome.org", "https://www.gnome.org", FALSE },
+ { "http://www.gnome.org/a%2e%2e%2e/b", "https://www.gnome.org/a.../b", TRUE },
+ { "http://www.gnome.org/a%2e%2e%2eb", "https://www.gnome.org/a...b", TRUE },
+ /* 40 */{ "http://www.gnome.org/a%2e%2e%2e//", "https://www.gnome.org/a.../", FALSE },
+ { "https://www.gnome.ORG", "https://www.gnome.org", TRUE },
+ { "https://www.gnome.orG", "https://www.gnome.org", TRUE },
+ { "https://www.gnome.org/2", "https://www.gnome.org/234", FALSE }
};
gint ii;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]