summaryrefslogtreecommitdiffstats
path: root/src/openvpn/push.c
diff options
context:
space:
mode:
authorGert Doering <gert@greenie.muc.de>2012-12-25 13:41:50 +0100
committerDavid Sommerseth <davids@redhat.com>2013-01-02 12:54:37 +0100
commit1978db4b9657f0db134f1deaeb1e8400bf6a033e (patch)
tree60a4fe4f2ca7508eb50f67df5f489dba85c786db /src/openvpn/push.c
parentd39f31d96378aa5eeade74670ffd9e08bf4c7234 (diff)
downloadopenvpn-1978db4b9657f0db134f1deaeb1e8400bf6a033e.tar.gz
openvpn-1978db4b9657f0db134f1deaeb1e8400bf6a033e.tar.xz
openvpn-1978db4b9657f0db134f1deaeb1e8400bf6a033e.zip
Fix client crash on double PUSH_REPLY.
Introduce an extra bool variable c2.pulled_options_md5_init_done to keep track of md5_init state of pulled_options_state - avoid accessing uninitialized state when a second PUSH_REPLY comes in (which only happens under very particular circumstances). Bug tracked down by Arne Schwabe <arne@rfc2549.rrg>. Signed-off-by: Gert Doering <gert@greenie.muc.de> Acked-by: Arne Schwabe <arne@rfc2549.org> Message-Id: 20121225124856.GT22465@greenie.muc.de URL: http://article.gmane.org/gmane.network.openvpn.devel/7216 Signed-off-by: David Sommerseth <davids@redhat.com>
Diffstat (limited to 'src/openvpn/push.c')
-rw-r--r--src/openvpn/push.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/openvpn/push.c b/src/openvpn/push.c
index 05a38e0..be50bef 100644
--- a/src/openvpn/push.c
+++ b/src/openvpn/push.c
@@ -446,10 +446,14 @@ process_incoming_push_msg (struct context *c,
if (ch == ',')
{
struct buffer buf_orig = buf;
+ if (!c->c2.pulled_options_md5_init_done)
+ {
+ md5_state_init (&c->c2.pulled_options_state);
+ c->c2.pulled_options_md5_init_done = true;
+ }
if (!c->c2.did_pre_pull_restore)
{
pre_pull_restore (&c->options);
- md5_state_init (&c->c2.pulled_options_state);
c->c2.did_pre_pull_restore = true;
}
if (apply_push_options (&c->options,
@@ -463,6 +467,7 @@ process_incoming_push_msg (struct context *c,
case 1:
md5_state_update (&c->c2.pulled_options_state, BPTR(&buf_orig), BLEN(&buf_orig));
md5_state_final (&c->c2.pulled_options_state, &c->c2.pulled_options_digest);
+ c->c2.pulled_options_md5_init_done = false;
ret = PUSH_MSG_REPLY;
break;
case 2: