summaryrefslogtreecommitdiffstats
path: root/src/openvpn/push.c
diff options
context:
space:
mode:
authorJens Wagner <jwagner@hexonet.net>2014-01-07 22:07:54 +0100
committerGert Doering <gert@greenie.muc.de>2014-01-07 22:07:54 +0100
commit1aac9a0b7a4046822a0134cd8693a828f2e16576 (patch)
treefeb49ed40b997503a6102911ba7c563bdab3a7f4 /src/openvpn/push.c
parent64e4079f32e70a25e603470483c0e95549b3ab1d (diff)
downloadopenvpn-1aac9a0b7a4046822a0134cd8693a828f2e16576.tar.gz
openvpn-1aac9a0b7a4046822a0134cd8693a828f2e16576.tar.xz
openvpn-1aac9a0b7a4046822a0134cd8693a828f2e16576.zip
Fix spurious ignoring of pushed config options (trac#349).
The function incoming_push_message(...) in push.c uses a local variable option_types_found, that gets passed to do_up(...). If the server push got split into several parts, only the last part (PUSH_MSG_REPLY) option_types_found is used for do_up (initilized as 0 locally), the previous ones (PUSH_MSG_CONTINUATION) are ignored. So e.g. a ping config, pushed by the server in the first push, followed by a lot of "push route" configs, causing a second push message, will have the do_up() called, but without e.g. the OPT_P_TIMER flag, so those options will be silently ignored. The patch resolves that, by introducing "push_option_types_found" in "c->options" and using that as storage. Fix trac bug #349. Acked-by: Gert Doering <gert@greenie.muc.de> URL: https://community.openvpn.net/openvpn/ticket/349 Signed-off-by: Gert Doering <gert@greenie.muc.de>
Diffstat (limited to 'src/openvpn/push.c')
-rw-r--r--src/openvpn/push.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/openvpn/push.c b/src/openvpn/push.c
index bd08cff..e971357 100644
--- a/src/openvpn/push.c
+++ b/src/openvpn/push.c
@@ -203,8 +203,10 @@ incoming_push_message (struct context *c, const struct buffer *buffer)
msg (D_PUSH_ERRORS, "WARNING: Received bad push/pull message: %s", sanitize_control_message(BSTR(buffer), &gc));
else if (status == PUSH_MSG_REPLY || status == PUSH_MSG_CONTINUATION)
{
+ c->options.push_option_types_found |= option_types_found;
+
if (status == PUSH_MSG_REPLY)
- do_up (c, true, option_types_found); /* delay bringing tun/tap up until --push parms received from remote */
+ do_up (c, true, c->options.push_option_types_found ); /* delay bringing tun/tap up until --push parms received from remote */
event_timeout_clear (&c->c2.push_request_interval);
}