[X2Go-Commits] [libx2goclient] 02/06: src/x2goclient-network-ssh.c: fully implement IPv6 address checking; also split out into helper function.

git-admin at x2go.org git-admin at x2go.org
Mon Jul 29 12:13:24 CEST 2019


This is an automated email from the git hooks/post-receive script.

x2go pushed a commit to branch master
in repository libx2goclient.

commit d6ce1707afac4e9930850a8e17c21bd92f0220b9
Author: Mihai Moldovan <ionic at ionic.de>
Date:   Mon Jul 29 10:51:11 2019 +0200

    src/x2goclient-network-ssh.c: fully implement IPv6 address checking; also split out into helper function.
---
 src/x2goclient-network-ssh.c | 133 ++++++++++++++++++++++++++-----------------
 1 file changed, 82 insertions(+), 51 deletions(-)

diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c
index 05c0775..82cccaa 100644
--- a/src/x2goclient-network-ssh.c
+++ b/src/x2goclient-network-ssh.c
@@ -52,7 +52,9 @@
 #define X2GOCLIENT_NETWORK_SSH_ERROR g_quark_from_static_string ("x2goclient-network-ssh")
 
 enum {
-  X2GOCLIENT_NETWORK_SSH_ERROR_PORT_CONV = 0
+  X2GOCLIENT_NETWORK_SSH_ERROR_PORT_CONV = 0,
+  X2GOCLIENT_NETWORK_SSH_ERROR_IPV6_CONV,
+  X2GOCLIENT_NETWORK_SSH_ERROR_IPV4_CONV
 };
 
 struct _X2GoClientNetworkOptionsSSH {
@@ -117,9 +119,11 @@ static GSocketAddress* x2goclient_network_ssh_parse_sockspec_unix_socket (const
   return (ret);
 }
 
-static guint16 x2goclient_network_ssh_parse_sockspec_port (const GString *portspec, GError **port_parse_err) {
+static guint16 x2goclient_network_ssh_parse_sockspec_port (const GString *portspec, GError **err) {
   guint16 ret = 0;
 
+  g_return_val_if_fail (err == NULL || *err == NULL, ret);
+
   if (':' == portspec->str[0]) {
     /*
      * In the worst case, portspec->str[1] will point to a terminating NULL
@@ -145,7 +149,7 @@ static guint16 x2goclient_network_ssh_parse_sockspec_port (const GString *portsp
     }
 
     if (err_msg) {
-      g_set_error_literal (port_parse_err, X2GOCLIENT_NETWORK_SSH_ERROR, X2GOCLIENT_NETWORK_SSH_ERROR_PORT_CONV, err_msg);
+      g_set_error_literal (err, X2GOCLIENT_NETWORK_SSH_ERROR, X2GOCLIENT_NETWORK_SSH_ERROR_PORT_CONV, err_msg);
       err_msg = NULL;
     }
   }
@@ -157,54 +161,58 @@ static guint16 x2goclient_network_ssh_parse_sockspec_port (const GString *portsp
   return (ret);
 }
 
-static GSocketAddress* x2goclient_network_ssh_parse_sockspec (X2GoClientNetworkSSH *self, const GString *sockspec) {
+static GSocketAddress* x2goclient_network_ssh_parse_sockspec_ip (const GString *sockspec, const gboolean want_v6, GError **err) {
   GSocketAddress *ret = NULL;
 
-  if (sockspec) {
-    /* Check if it's possibly a UNIX socket. */
-    ret = x2goclient_network_ssh_parse_sockspec_unix_socket (sockspec);
-
-    if (!ret) {
-      /* Must be not a UNIX socket, continue checking for IPv6 addresses. */
-
-      /* We're free to sanitize the string now. */
-      g_strstrip (sockspec->str);
+  g_return_val_if_fail (err == NULL || *err == NULL, ret);
 
-      gboolean could_be_v6 = FALSE;
-      gboolean is_v6 = FALSE;
-      gboolean port_parse_err = TRUE;
-      gchar *tmp_start = sockspec->str;
-      gchar *tmp_end = NULL;
-      GString *v6_address = NULL;
-      GString *address = NULL;
-      guint16 port = 0;
-
-      /*
-       * As a very common convention, IPv6 addresses have to be encapsulated in
-       * brackets if an additional port is specified, check for that.
-       */
-      if ('[' == tmp_start[0]) {
-        tmp_end = g_strstr_len (tmp_start, -1, "]");
+  /* We're free to sanitize the string now. */
+  GString *work_sockspec = NULL;
+  {
+    gchar *sanitize_sockspec = g_strdup (sockspec->str);
+    g_strstrip (sanitize_sockspec);
+    work_sockspec = g_string_new (g_strstrip (sanitize_sockspec));
+    g_free (sanitize_sockspec);
+    sanitize_sockspec = NULL;
+  }
 
-        if (tmp_end) {
-          /*
-           * Looks like a bracket-encapsulated IPv6 address so far.
-           * See if that checks out.
-           */
-          could_be_v6 = TRUE;
-          ++tmp_start;
-          --tmp_end;
+  gchar *tmp_start = work_sockspec->str,
+        *tmp_end = NULL;
+  GString *address = NULL;
+  guint16 port = 0;
 
-          v6_address = g_string_new_len (tmp_start, tmp_end - tmp_start);
-        }
+  if (want_v6) {
+    /*
+     * As a very common convention, IPv6 addresses have to be encapsulated in
+     * brackets if an additional port is specified, check for that.
+     */
+    if ('[' == tmp_start[0]) {
+      tmp_end = g_strstr_len (tmp_start, -1, "]");
+
+      if (tmp_end) {
+        /*
+         * Looks like a bracket-encapsulated IPv6 address so far.
+         * See if that checks out.
+         */
+        ++tmp_start;
+        --tmp_end;
+
+        address = g_string_new_len (tmp_start, tmp_end - tmp_start);
       }
       else {
-        v6_address = g_string_new_len (tmp_start, sockspec->len);
+        g_set_error_literal (err, X2GOCLIENT_NETWORK_SSH_ERROR, X2GOCLIENT_NETWORK_SSH_ERROR_IPV6_CONV, "Found starting bracket, but no matching ending bracket.");
       }
+    }
+    else {
+      address = g_string_new_len (tmp_start, work_sockspec->len);
+    }
+  }
 
-      /* Check for an IPv6 address first. */
+  if (!err) {
+    if (want_v6) {
+      /* Check for an IPv6 address. */
       char binary_rep[128] = { 0 };
-      is_v6 = (1 == inet_pton (AF_INET6, v6_address->str, &binary_rep));
+      gboolean is_v6 = (1 == inet_pton (AF_INET6, address->str, &binary_rep));
 
       if (is_v6) {
         /* Passed a valid IPv6 address. */
@@ -224,22 +232,45 @@ static GSocketAddress* x2goclient_network_ssh_parse_sockspec (X2GoClientNetworkS
           portspec = NULL;
 
           if (tmp_err) {
-            g_log (NULL, G_LOG_LEVEL_WARNING, "Unable to convert port specifier: %s", tmp_err->message);
-          }
-          else {
-            port_parse_err = FALSE;
+            g_set_error (err, X2GOCLIENT_NETWORK_SSH_ERROR, X2GOCLIENT_NETWORK_SSH_ERROR_IPV6_CONV, "Unable to parse IPv6 address: %s", tmp_err->message);
+            g_clear_error (&tmp_err);
           }
         }
-        else {
-          address = g_string_new (v6_address->str);
-        }
-      }
-      else {
-        /*  */
       }
     }
   }
 
+  if (!err) {
+    /*
+     * Parsed everything successfully so far, so create IP socket address
+     * object.
+     */
+    ret = g_inet_socket_address_new_from_string (address->str, port);
+  }
+
+  g_string_free (work_sockspec, TRUE);
+  work_sockspec = NULL;
+
+  g_string_free (address, TRUE);
+  address = NULL;
+
+  return (ret);
+}
+
+static GSocketAddress* x2goclient_network_ssh_parse_sockspec (X2GoClientNetworkSSH *self, const GString *sockspec) {
+  GSocketAddress *ret = NULL;
+
+  if (sockspec) {
+    /* Check if it's possibly a UNIX socket. */
+    ret = x2goclient_network_ssh_parse_sockspec_unix_socket (sockspec);
+
+    if (!ret) {
+      /* Must be not a UNIX socket, continue checking for IPv6 addresses. */
+      GError *tmp_err = NULL;
+      ret = x2goclient_network_ssh_parse_sockspec_ip (sockspec, TRUE, &tmp_err);
+    }
+  }
+
   return ret;
 }
 

--
Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git


More information about the x2go-commits mailing list