diff options
author | Guillaume Nault <g.nault@alphalink.fr> | 2018-03-21 18:09:14 +0100 |
---|---|---|
committer | Dmitry Kozlov <xeb@mail.ru> | 2018-03-24 09:41:38 +0300 |
commit | 10ede239609e41e259be9c38932e33f7dc74bd8a (patch) | |
tree | 067a896b27825ee7cb8b09dc66f2c1091d2cb433 /accel-pppd/auth | |
parent | 29c626683ea1aa6136360a6afcc6a053d0342a3d (diff) | |
download | accel-ppp-10ede239609e41e259be9c38932e33f7dc74bd8a.tar.gz accel-ppp-10ede239609e41e259be9c38932e33f7dc74bd8a.zip |
auth: fix re-authentication of peer in all chap modules
If the peer re-authenticates (because of option conf_interval) and pwdb
calls auth_result(), we may add the interval timer again to the session
context. This crashes accel-ppp when deleting the session, because the
interval timer is removed only once and the superfluous timers are
still running. Therefore, when removing the context, triton detects
this issue and calls abort().
To fix this, we need to detect if the session is already started and
just send a CHAP Success message in this case.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
Diffstat (limited to 'accel-pppd/auth')
-rw-r--r-- | accel-pppd/auth/auth_chap_md5.c | 16 | ||||
-rw-r--r-- | accel-pppd/auth/auth_mschap_v1.c | 16 | ||||
-rw-r--r-- | accel-pppd/auth/auth_mschap_v2.c | 16 |
3 files changed, 30 insertions, 18 deletions
diff --git a/accel-pppd/auth/auth_chap_md5.c b/accel-pppd/auth/auth_chap_md5.c index 309af8a..ae062f5 100644 --- a/accel-pppd/auth/auth_chap_md5.c +++ b/accel-pppd/auth/auth_chap_md5.c @@ -265,14 +265,18 @@ static void auth_result(struct chap_auth_data *ad, int res) } else ppp_auth_failed(ad->ppp, name); } else { - if (ppp_auth_succeeded(ad->ppp, name)) { - chap_send_failure(ad); - ap_session_terminate(&ad->ppp->ses, TERM_AUTH_ERROR, 0); + if (!ad->started) { + if (ppp_auth_succeeded(ad->ppp, name)) { + chap_send_failure(ad); + ap_session_terminate(&ad->ppp->ses, TERM_AUTH_ERROR, 0); + } else { + chap_send_success(ad, ad->id); + ad->started = 1; + if (conf_interval) + triton_timer_add(ad->ppp->ses.ctrl->ctx, &ad->interval, 0); + } } else { chap_send_success(ad, ad->id); - ad->started = 1; - if (conf_interval) - triton_timer_add(ad->ppp->ses.ctrl->ctx, &ad->interval, 0); } } diff --git a/accel-pppd/auth/auth_mschap_v1.c b/accel-pppd/auth/auth_mschap_v1.c index 1042486..67f941c 100644 --- a/accel-pppd/auth/auth_mschap_v1.c +++ b/accel-pppd/auth/auth_mschap_v1.c @@ -268,14 +268,18 @@ static void auth_result(struct chap_auth_data *ad, int res) } else ppp_auth_failed(ad->ppp, name); } else { - if (ppp_auth_succeeded(ad->ppp, name)) { - chap_send_failure(ad, ad->mschap_error); - ap_session_terminate(&ad->ppp->ses, TERM_AUTH_ERROR, 0); + if (!ad->started) { + if (ppp_auth_succeeded(ad->ppp, name)) { + chap_send_failure(ad, ad->mschap_error); + ap_session_terminate(&ad->ppp->ses, TERM_AUTH_ERROR, 0); + } else { + chap_send_success(ad, ad->id); + ad->started = 1; + if (conf_interval) + triton_timer_add(ad->ppp->ses.ctrl->ctx, &ad->interval, 0); + } } else { chap_send_success(ad, ad->id); - ad->started = 1; - if (conf_interval) - triton_timer_add(ad->ppp->ses.ctrl->ctx, &ad->interval, 0); } } diff --git a/accel-pppd/auth/auth_mschap_v2.c b/accel-pppd/auth/auth_mschap_v2.c index 33b95de..5c82413 100644 --- a/accel-pppd/auth/auth_mschap_v2.c +++ b/accel-pppd/auth/auth_mschap_v2.c @@ -341,14 +341,18 @@ static void auth_result(struct chap_auth_data *ad, int res) } else ppp_auth_failed(ad->ppp, name); } else { - if (ppp_auth_succeeded(ad->ppp, name)) { - chap_send_failure(ad, ad->mschap_error, ad->reply_msg); - ap_session_terminate(&ad->ppp->ses, TERM_AUTH_ERROR, 0); + if (!ad->started) { + if (ppp_auth_succeeded(ad->ppp, name)) { + chap_send_failure(ad, ad->mschap_error, ad->reply_msg); + ap_session_terminate(&ad->ppp->ses, TERM_AUTH_ERROR, 0); + } else { + chap_send_success(ad, ad->id, ad->authenticator); + ad->started = 1; + if (conf_interval) + triton_timer_add(ad->ppp->ses.ctrl->ctx, &ad->interval, 0); + } } else { chap_send_success(ad, ad->id, ad->authenticator); - ad->started = 1; - if (conf_interval) - triton_timer_add(ad->ppp->ses.ctrl->ctx, &ad->interval, 0); } } |