Skip to content

Commit

Permalink
Extend push-remove to also handle 'ifconfig'.
Browse files Browse the repository at this point in the history
Push-remove (introduced in commit 970312f) did not handle "ifconfig"
yet, as both "ifconfig" and "ifconfig-ipv6" are handled differently from
all other pushed options.  Since there was no valid use-case to not-push
"ifconfig" (no support on the client side for running IPv6-only) this
was not an issue so far - but with the recent commits to enable ipv6-only
operation it can be a desirable feature.

The implementation is similar to "push-remove ifconfig-ipv6" - namely,
flagging via a new context option (c->options.push_ifconfig_ipv4_blocked)
and then not creating the push statement in "send_push_reply()".

While not truly elegant, it's much less invasive than the alternatives
(storing the list of "push-remove" statements somewhere and then checking
in push_option_ex())

Trac: #1072

Signed-off-by: Gert Doering <[email protected]>

Acked-by: Antonio Quartulli <[email protected]>
Message-Id: <[email protected]>
URL: https://www.mail-archive.com/[email protected]/msg17169.html
Signed-off-by: Gert Doering <[email protected]>
  • Loading branch information
cron2 committed Jul 2, 2018
1 parent 1987498 commit 6ae2f19
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 1 deletion.
5 changes: 5 additions & 0 deletions doc/openvpn.8
Original file line number Diff line number Diff line change
Expand Up @@ -3045,6 +3045,11 @@ an option,
can be used to first remove the old value, and then add a new
.B \-\-push
option with the new value.

NOTE2: due to implementation details, 'ifconfig' and 'ifconfig-ipv6'
can only be removed with an exact match on the option ("push-remove ifconfig"),
no substring matching and no matching on the IPv4/IPv6 address argument
is possible.
.\"*********************************************************
.TP
.B \-\-push\-peer\-info
Expand Down
1 change: 1 addition & 0 deletions src/openvpn/options.h
Original file line number Diff line number Diff line change
Expand Up @@ -425,6 +425,7 @@ struct options
bool push_ifconfig_constraint_defined;
in_addr_t push_ifconfig_constraint_network;
in_addr_t push_ifconfig_constraint_netmask;
bool push_ifconfig_ipv4_blocked; /* IPv4 */
bool push_ifconfig_ipv6_defined; /* IPv6 */
struct in6_addr push_ifconfig_ipv6_local; /* IPv6 */
int push_ifconfig_ipv6_netbits; /* IPv6 */
Expand Down
10 changes: 9 additions & 1 deletion src/openvpn/push.c
Original file line number Diff line number Diff line change
Expand Up @@ -342,7 +342,8 @@ prepare_push_reply(struct context *c, struct gc_arena *gc,

/* ipv4 */
if (c->c2.push_ifconfig_defined && c->c2.push_ifconfig_local
&& c->c2.push_ifconfig_remote_netmask)
&& c->c2.push_ifconfig_remote_netmask
&& !o->push_ifconfig_ipv4_blocked)
{
in_addr_t ifconfig_local = c->c2.push_ifconfig_local;
if (c->c2.push_ifconfig_local_alias)
Expand Down Expand Up @@ -602,6 +603,13 @@ push_remove_option(struct options *o, const char *p)
{
msg(D_PUSH_DEBUG, "PUSH_REMOVE searching for: '%s'", p);

/* ifconfig is special, as not part of the push list */
if (streq(p, "ifconfig"))
{
o->push_ifconfig_ipv4_blocked = true;
return;
}

/* ifconfig-ipv6 is special, as not part of the push list */
if (streq( p, "ifconfig-ipv6" ))
{
Expand Down

0 comments on commit 6ae2f19

Please sign in to comment.