[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