diff options
author | Dmitry Kozlov <xeb@mail.ru> | 2014-10-04 18:52:17 +0400 |
---|---|---|
committer | Dmitry Kozlov <xeb@mail.ru> | 2014-10-04 18:52:17 +0400 |
commit | 43a444fc65d917bf680831c0b942d682d933dc84 (patch) | |
tree | cc7c85b61e86f72795e4c3881199e3a96ddd0ca6 | |
parent | cc301ec08bf329968cea8fab8a5d7c4b05a1870b (diff) | |
download | accel-ppp-43a444fc65d917bf680831c0b942d682d933dc84.tar.gz accel-ppp-43a444fc65d917bf680831c0b942d682d933dc84.zip |
radius: various bug fixes
-rw-r--r-- | accel-pppd/radius/acct.c | 19 | ||||
-rw-r--r-- | accel-pppd/radius/auth.c | 3 | ||||
-rw-r--r-- | accel-pppd/radius/radius.c | 15 | ||||
-rw-r--r-- | accel-pppd/radius/radius_p.h | 2 | ||||
-rw-r--r-- | accel-pppd/radius/req.c | 6 | ||||
-rw-r--r-- | accel-pppd/radius/serv.c | 12 | ||||
-rw-r--r-- | accel-pppd/triton/triton.c | 2 |
7 files changed, 44 insertions, 15 deletions
diff --git a/accel-pppd/radius/acct.c b/accel-pppd/radius/acct.c index c4b37cd..7fbf137 100644 --- a/accel-pppd/radius/acct.c +++ b/accel-pppd/radius/acct.c @@ -312,9 +312,10 @@ static void rad_acct_stop_sent(struct rad_req_t *req, int res) if (req->rpd) rad_acct_stop_defer(req->rpd); else { - if (ap_shutdown) + if (ap_shutdown) { rad_req_free(req); - else + req->rpd->acct_req = NULL; + } else req->try = 0; } @@ -353,6 +354,9 @@ static void rad_acct_stop_timeout(struct triton_timer_t *t) { struct rad_req_t *req = container_of(t, typeof(*req), timeout); + if (!req->rpd) + log_switch(triton_context_self(), NULL); + if (req->active) { rad_server_req_exit(req); rad_server_timeout(req->serv); @@ -381,6 +385,7 @@ static void rad_acct_stop_timeout(struct triton_timer_t *t) static void start_deferred(struct rad_req_t *req) { + log_switch(triton_context_self(), NULL); if (req->hnd.fd != -1) { triton_md_register_handler(NULL, &req->hnd); triton_md_enable_handler(&req->hnd, MD_MODE_READ); @@ -394,7 +399,8 @@ static void start_deferred(struct rad_req_t *req) void rad_acct_stop_defer(struct radius_pd_t *rpd) { struct rad_req_t *req = rpd->acct_req; - rad_server_req_cancel(req); + + rad_server_req_cancel(req, 1); if (req->hnd.tpd) triton_md_unregister_handler(&req->hnd, 0); rpd->acct_req = NULL; @@ -411,10 +417,11 @@ int rad_acct_stop(struct radius_pd_t *rpd) struct rad_req_t *req = rpd->acct_req; struct timespec ts; - if (req) { + if (rpd->acct_interim_timer.tpd) triton_timer_del(&rpd->acct_interim_timer); - - rad_server_req_cancel(req); + + if (req) { + rad_server_req_cancel(req, 1); clock_gettime(CLOCK_MONOTONIC, &ts); req->ts = ts.tv_sec; diff --git a/accel-pppd/radius/auth.c b/accel-pppd/radius/auth.c index b73f259..d166192 100644 --- a/accel-pppd/radius/auth.c +++ b/accel-pppd/radius/auth.c @@ -181,6 +181,9 @@ static void rad_auth_recv(struct rad_req_t *req) .reply = pack, }; triton_event_fire(EV_RADIUS_ACCESS_ACCEPT, &ev); + } else { + rad_auth_finalize(req->rpd, PWDB_DENIED); + return; } if (req->rpd->auth_ctx->recv && req->rpd->auth_ctx->recv(req)) { diff --git a/accel-pppd/radius/radius.c b/accel-pppd/radius/radius.c index fa2b6a6..6cf5ead 100644 --- a/accel-pppd/radius/radius.c +++ b/accel-pppd/radius/radius.c @@ -355,10 +355,15 @@ static void ses_finishing(struct ap_session *ses) { struct radius_pd_t *rpd = find_pd(ses); - if (!rpd->acct_started) - return; + if (rpd->auth_ctx) { + rad_server_req_cancel(rpd->auth_ctx->req, 1); + rad_req_free(rpd->auth_ctx->req); + mempool_free(rpd->auth_ctx); + rpd->auth_ctx = NULL; + } - rad_acct_stop(rpd); + if (rpd->acct_started || rpd->acct_req) + rad_acct_stop(rpd); } static void ses_finished(struct ap_session *ses) @@ -373,7 +378,7 @@ static void ses_finished(struct ap_session *ses) pthread_rwlock_unlock(&sessions_lock); if (rpd->auth_ctx) { - rad_server_req_cancel(rpd->auth_ctx->req); + rad_server_req_cancel(rpd->auth_ctx->req, 1); rad_req_free(rpd->auth_ctx->req); mempool_free(rpd->auth_ctx); rpd->auth_ctx = NULL; @@ -383,7 +388,7 @@ static void ses_finished(struct ap_session *ses) if (rpd->acct_started) rad_acct_stop_defer(rpd); else { - rad_server_req_cancel(rpd->acct_req); + rad_server_req_cancel(rpd->acct_req, 1); rad_req_free(rpd->acct_req); } } diff --git a/accel-pppd/radius/radius_p.h b/accel-pppd/radius/radius_p.h index 22124a2..b76cfca 100644 --- a/accel-pppd/radius/radius_p.h +++ b/accel-pppd/radius/radius_p.h @@ -208,7 +208,7 @@ struct rad_server_t *rad_server_get2(int, in_addr_t, int); void rad_server_put(struct rad_server_t *, int); int rad_server_req_enter(struct rad_req_t *); void rad_server_req_exit(struct rad_req_t *); -int rad_server_req_cancel(struct rad_req_t *); +int rad_server_req_cancel(struct rad_req_t *, int full); int rad_server_realloc(struct rad_req_t *); void rad_server_fail(struct rad_server_t *); void rad_server_timeout(struct rad_server_t *); diff --git a/accel-pppd/radius/req.c b/accel-pppd/radius/req.c index 94754a2..0382e16 100644 --- a/accel-pppd/radius/req.c +++ b/accel-pppd/radius/req.c @@ -231,6 +231,7 @@ int rad_req_acct_fill(struct rad_req_t *req) void rad_req_free(struct rad_req_t *req) { assert(!req->active); + assert(!req->entry.next); if (req->serv) rad_server_put(req->serv, req->type); @@ -386,6 +387,9 @@ int rad_req_read(struct triton_md_handler_t *h) struct rad_req_t *req = container_of(h, typeof(*req), hnd); struct rad_packet_t *pack; + if (!req->rpd) + log_switch(triton_context_self(), NULL); + while (1) { if (rad_packet_recv(h->fd, &pack, NULL)) return 0; @@ -400,6 +404,8 @@ int rad_req_read(struct triton_md_handler_t *h) if (req->active) rad_server_req_exit(req); + else + rad_server_req_cancel(req, 0); if (req->log) { req->log("recv "); diff --git a/accel-pppd/radius/serv.c b/accel-pppd/radius/serv.c index 441936c..664c11d 100644 --- a/accel-pppd/radius/serv.c +++ b/accel-pppd/radius/serv.c @@ -104,7 +104,10 @@ static void req_wakeup(struct rad_req_t *req) { struct timespec ts; - log_ppp_debug("radius(%i): wakeup %i\n", req->serv->id, req->active); + if (!req->rpd) + log_switch(triton_context_self(), NULL); + + log_ppp_debug("radius(%i): wakeup %p %i\n", req->serv->id, req, req->active); if (!req->active) return; @@ -128,7 +131,7 @@ static void req_wakeup(struct rad_req_t *req) req->send(req, 1); } -int rad_server_req_cancel(struct rad_req_t *req) +int rad_server_req_cancel(struct rad_req_t *req, int full) { int r = 0; @@ -140,6 +143,11 @@ int rad_server_req_cancel(struct rad_req_t *req) } pthread_mutex_unlock(&req->serv->lock); + triton_cancel_call(req->rpd ? req->rpd->ses->ctrl->ctx : NULL, (triton_event_func)req_wakeup); + + if (!full) + return r; + if (req->active) rad_server_req_exit(req); diff --git a/accel-pppd/triton/triton.c b/accel-pppd/triton/triton.c index f550db2..2807da8 100644 --- a/accel-pppd/triton/triton.c +++ b/accel-pppd/triton/triton.c @@ -517,7 +517,7 @@ int __export triton_context_call(struct triton_context_t *ud, void (*func)(void void __export triton_cancel_call(struct triton_context_t *ud, void (*func)(void *)) { - struct _triton_context_t *ctx = (struct _triton_context_t *)ud->tpd; + struct _triton_context_t *ctx = ud ? (struct _triton_context_t *)ud->tpd : (struct _triton_context_t *)default_ctx.tpd; struct list_head *pos, *n; struct _triton_ctx_call_t *call; |