[gvfs] client: Escape ":[]" chars in host if it is not IPv6



commit d8556a0db3243e9c5628307dc3f7d840d1228bd1
Author: Ondrej Holy <oholy redhat com>
Date:   Thu Dec 1 13:02:58 2016 +0100

    client: Escape ":[]" chars in host if it is not IPv6
    
    The "[]:" chars are omitted currently when encoding uri, because they
    are valid for IPv6. This causes problems in some cases, e.g. output from
    g_file_get_uri(g_file_new_for_uri("dav+sd://foo%3Abar._webdav._tcp.local"))
    is "dav+sd://foo:bar._webdav._tcp.local/", which is obviously wrong. Add
    gvfs_is_ipv6 in order to detect IPv6 addresses and encode also "[]:" chars
    in other cases. Use gvfs_is_ipv6 to detect IPv6 also in some backends.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=772849

 client/gvfsuriutils.c   |   20 ++++++++++++++------
 common/gvfsutils.c      |   20 ++++++++++++++++++++
 common/gvfsutils.h      |    2 ++
 daemon/gvfsbackenddav.c |    3 ++-
 daemon/gvfsbackendsmb.c |    2 +-
 5 files changed, 39 insertions(+), 8 deletions(-)
---
diff --git a/client/gvfsuriutils.c b/client/gvfsuriutils.c
index 58a71e1..57ad5f1 100644
--- a/client/gvfsuriutils.c
+++ b/client/gvfsuriutils.c
@@ -22,6 +22,7 @@
 
 #include <config.h>
 #include "gvfsuriutils.h"
+#include "gvfsutils.h"
 #include <string.h>
 #include <stdlib.h>
 
@@ -264,12 +265,19 @@ g_vfs_encode_uri (GDecodedUri *decoded, gboolean allow_utf8)
                                       G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO, allow_utf8);
          g_string_append_c (uri, '@');
        }
-      
-      g_string_append_uri_escaped (uri, decoded->host,
-                                  /* Allowed unescaped in hostname / ip address */
-                                  G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS ":[]" ,
-                                  allow_utf8);
-      
+
+      if (gvfs_is_ipv6 (decoded->host))
+        {
+          g_string_append (uri, decoded->host);
+        }
+      else
+        {
+          g_string_append_uri_escaped (uri, decoded->host,
+                                       /* Allowed unescaped in hostname / ip address */
+                                       G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS,
+                                       allow_utf8);
+        }
+
       if (decoded->port != -1)
        {
          g_string_append_c (uri, ':');
diff --git a/common/gvfsutils.c b/common/gvfsutils.c
index 1c5c2e3..cb994e4 100644
--- a/common/gvfsutils.c
+++ b/common/gvfsutils.c
@@ -125,3 +125,23 @@ gvfs_setup_debug_handler (void)
   sa.sa_flags = 0;
   sigaction (SIGUSR2, &sa, NULL);
 }
+
+gboolean
+gvfs_is_ipv6 (const char *host)
+{
+  const char *p = host;
+
+  g_return_val_if_fail (host != NULL, FALSE);
+
+  if (*p != '[')
+    return FALSE;
+
+  while (++p)
+    if (!g_ascii_isxdigit (*p) && *p != ':')
+      break;
+
+  if (*p != ']' || *(p + 1) != '\0')
+    return FALSE;
+
+  return TRUE;
+}
diff --git a/common/gvfsutils.h b/common/gvfsutils.h
index 2c2146c..acaea9d 100644
--- a/common/gvfsutils.h
+++ b/common/gvfsutils.h
@@ -30,6 +30,8 @@ gboolean     gvfs_get_debug                         (void);
 void         gvfs_set_debug                         (gboolean          debugging);
 void         gvfs_setup_debug_handler               (void);
 
+gboolean     gvfs_is_ipv6                           (const char       *host);
+
 G_END_DECLS
 
 #endif /* __G_VFS_UTILS_H__ */
diff --git a/daemon/gvfsbackenddav.c b/daemon/gvfsbackenddav.c
index 89fe54e..e8a3903 100644
--- a/daemon/gvfsbackenddav.c
+++ b/daemon/gvfsbackenddav.c
@@ -59,6 +59,7 @@
 #include "gvfsjobpush.h"
 #include "gvfsdaemonprotocol.h"
 #include "gvfsdaemonutils.h"
+#include "gvfsutils.h"
 
 #ifdef HAVE_AVAHI
 #include "gvfsdnssdutils.h"
@@ -1654,7 +1655,7 @@ g_mount_spec_to_dav_uri (GMountSpec *spec)
   soup_uri_set_user (uri, user);
 
   /* IPv6 host does not include brackets in SoupURI, but GMountSpec host does */
-  if (host[0] == '[')
+  if (gvfs_is_ipv6 (host))
     uri->host = g_strndup (host + 1, strlen (host) - 2);
   else
     soup_uri_set_host (uri, host);
diff --git a/daemon/gvfsbackendsmb.c b/daemon/gvfsbackendsmb.c
index be648dc..305c885 100644
--- a/daemon/gvfsbackendsmb.c
+++ b/daemon/gvfsbackendsmb.c
@@ -326,7 +326,7 @@ create_smb_uri_string (const char *server,
     return uri;
 
   /* IPv6 server includes brackets in GMountSpec, smbclient doesn't */
-  if (server[0] == '[')
+  if (gvfs_is_ipv6 (server))
     {
       g_string_append_uri_escaped (uri, server + 1, NULL, FALSE);
       g_string_truncate (uri, uri->len - 3);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]