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@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