For the records, the following changes were requested to this patch
(some via GH):
1) improve (add?) commit message;
2) add comments/documentation to ipv6_get_special_addr()
3) get rid of the ipv6_is_special_addr() wrapper as it is not really
doing much.
Cheers,
On 23/11/2021 09:37, François Kooman wrote:
fix for #1161
Signed-off-by: François Kooman <fkoo...@tuxed.net>
---
src/openvpn/options.c | 2 +-
src/openvpn/route.c | 67 +++++++++++++++++++++++++++++++++++++++++--
src/openvpn/route.h | 1 +
3 files changed, 67 insertions(+), 3 deletions(-)
diff --git a/src/openvpn/options.c b/src/openvpn/options.c
index cc3d9fa0..3d530d7a 100644
--- a/src/openvpn/options.c
+++ b/src/openvpn/options.c
@@ -6558,7 +6558,7 @@ add_option(struct options *options,
msg(msglevel, "route-ipv6 parameter network/IP '%s' must be a
valid address", p[1]);
goto err;
}
- if (p[2] && !ipv6_addr_safe(p[2]))
+ if (p[2] && !ipv6_addr_safe(p[2]) && !ipv6_is_special_addr(p[2]))
{
msg(msglevel, "route-ipv6 parameter gateway '%s' must be a valid
address", p[2]);
goto err;
diff --git a/src/openvpn/route.c b/src/openvpn/route.c
index fd1125ef..bd62b99a 100644
--- a/src/openvpn/route.c
+++ b/src/openvpn/route.c
@@ -287,6 +287,38 @@ get_special_addr(const struct route_list *rl,
return false;
}
+static bool
+ipv6_get_special_addr(const struct route_ipv6_list *rl,
+ const char *string,
+ struct in6_addr *out,
+ bool *status)
+{
+ if (status)
+ {
+ *status = true;
+ }
+ if (!strcmp(string, "net_gateway_ipv6"))
+ {
+ if (rl)
+ {
+ if (rl->rgi6.flags & RGI_ADDR_DEFINED)
+ {
+ *out = rl->rgi6.gateway.addr_ipv6;
+ }
+ else
+ {
+ msg(M_INFO, PACKAGE_NAME " ROUTE: net_gateway_ipv6 undefined --
unable to get default gateway from system");
+ if (status)
+ {
+ *status = false;
+ }
+ }
+ }
+ return true;
+ }
+ return false;
+}
+
bool
is_special_addr(const char *addr_str)
{
@@ -300,6 +332,19 @@ is_special_addr(const char *addr_str)
}
}
+bool
+ipv6_is_special_addr(const char *addr_str)
+{
+ if (addr_str)
+ {
+ return ipv6_get_special_addr(NULL, addr_str, NULL, NULL);
+ }
+ else
+ {
+ return false;
+ }
+}
+
static bool
init_route(struct route_ipv4 *r,
struct addrinfo **network_list,
@@ -438,6 +483,7 @@ init_route_ipv6(struct route_ipv6 *r6,
const struct route_ipv6_option *r6o,
const struct route_ipv6_list *rl6 )
{
+ bool status;
CLEAR(*r6);
if (!get_ipv6_addr( r6o->prefix, &r6->network, &r6->netbits, M_WARN ))
@@ -448,9 +494,26 @@ init_route_ipv6(struct route_ipv6 *r6,
/* gateway */
if (is_route_parm_defined(r6o->gateway))
{
- if (inet_pton( AF_INET6, r6o->gateway, &r6->gateway ) != 1)
+ if (ipv6_get_special_addr(rl6, r6o->gateway, &r6->gateway, &status))
{
- msg( M_WARN, PACKAGE_NAME "ROUTE6: cannot parse gateway spec '%s'",
r6o->gateway );
+ r6->metric = 1;
+#ifdef _WIN32
+ r6->adapter_index = rl6->rgi6.adapter_index;
+#else
+ r6->iface = rl6->rgi6.iface;
+#endif
+ r6->flags = RT_DEFINED | RT_METRIC_DEFINED;
+ }
+ else
+ {
+ if (inet_pton( AF_INET6, r6o->gateway, &r6->gateway ) != 1)
+ {
+ msg( M_WARN, PACKAGE_NAME "ROUTE6: cannot parse gateway spec
'%s'", r6o->gateway );
+ }
+ }
+ if (!status)
+ {
+ goto fail;
}
}
else if (rl6->spec_flags & RTSA_REMOTE_ENDPOINT)
diff --git a/src/openvpn/route.h b/src/openvpn/route.h
index dc448c74..bbb8d2f8 100644
--- a/src/openvpn/route.h
+++ b/src/openvpn/route.h
@@ -320,6 +320,7 @@ void setenv_routes(struct env_set *es, const struct
route_list *rl);
void setenv_routes_ipv6(struct env_set *es, const struct route_ipv6_list
*rl6);
bool is_special_addr(const char *addr_str);
+bool ipv6_is_special_addr(const char *addr_str);
void get_default_gateway(struct route_gateway_info *rgi,
openvpn_net_ctx_t *ctx);
--
Antonio Quartulli
_______________________________________________
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel