From: Alan T. DeKok Date: Sun, 17 Mar 2013 03:09:25 +0000 (-0400) Subject: Move EAP handler, EAP_DS, eap_packet_t to use talloc X-Git-Tag: release_3_0_0_beta1~720 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=aa6c111fa61460144d52c99c8baaaf103f9f7acc;p=thirdparty%2Ffreeradius-server.git Move EAP handler, EAP_DS, eap_packet_t to use talloc --- diff --git a/src/modules/rlm_eap/eap.c b/src/modules/rlm_eap/eap.c index 95829dd3569..35a0ab72bf8 100644 --- a/src/modules/rlm_eap/eap.c +++ b/src/modules/rlm_eap/eap.c @@ -700,9 +700,6 @@ int eap_start(rlm_eap_t *inst, REQUEST *request) * EAP-Starts. */ if ((eap_msg->length == 0) || (eap_msg->length == 2)) { - EAP_DS *eap_ds; - eap_handler_t handler; - /* * It's a valid EAP-Start, but the request * was marked as being proxied. So we don't @@ -716,32 +713,20 @@ int eap_start(rlm_eap_t *inst, REQUEST *request) } RDEBUG2("Got EAP_START message"); - if ((eap_ds = eap_ds_alloc()) == NULL) { - RDEBUG2("EAP Start failed in allocation"); - return EAP_FAIL; - } + vp = paircreate(request->reply, PW_EAP_MESSAGE, 0); + if (!vp) return EAP_FAIL; + pairadd(&request->reply->vps, vp); /* - * It's an EAP-Start packet. Tell them to stop wasting - * our time, and give us an EAP-Identity packet. - * - * Hmm... we should probably check the contents of the - * EAP-Start packet for something... + * Manually create an EAP Identity request */ - eap_ds->request->code = PW_EAP_REQUEST; - eap_ds->request->type.num = PW_EAP_IDENTITY; - - /* - * We don't have a handler, but eap_compose needs one, - * (for various reasons), so we fake it out here. - */ - memset(&handler, 0, sizeof(handler)); - handler.request = request; - handler.eap_ds = eap_ds; - - eap_compose(&handler); + vp->vp_octets[0] = PW_EAP_REQUEST; + vp->vp_octets[1] = 0; /* ID */ + vp->vp_octets[2] = 0; + vp->vp_octets[3] = 5; /* length */ + vp->vp_octets[4] = PW_EAP_IDENTITY; + vp->length = 5; - eap_ds_free(&eap_ds); return EAP_FOUND; } /* end of handling EAP-Start */ @@ -905,7 +890,7 @@ void eap_fail(eap_handler_t *handler) pairdelete(&handler->request->reply->vps, PW_STATE, 0, TAG_ANY); eap_packet_free(&handler->eap_ds->request); - handler->eap_ds->request = eap_packet_alloc(); + handler->eap_ds->request = eap_packet_alloc(handler->eap_ds); handler->eap_ds->request->code = PW_EAP_FAILURE; eap_compose(handler); @@ -990,14 +975,15 @@ static char *eap_identity(REQUEST *request, eap_packet_raw_t *eap_packet) /* * Create our Request-Response data structure with the eap packet */ -static EAP_DS *eap_buildds(eap_packet_raw_t **eap_packet_p) +static EAP_DS *eap_buildds(eap_handler_t *handler, + eap_packet_raw_t **eap_packet_p) { EAP_DS *eap_ds = NULL; eap_packet_raw_t *eap_packet = *eap_packet_p; int typelen; uint16_t len; - if ((eap_ds = eap_ds_alloc()) == NULL) { + if ((eap_ds = eap_ds_alloc(handler)) == NULL) { return NULL; } @@ -1191,7 +1177,7 @@ eap_handler_t *eap_handler(rlm_eap_t *inst, eap_packet_raw_t **eap_packet_p, } } - handler->eap_ds = eap_buildds(eap_packet_p); + handler->eap_ds = eap_buildds(handler, eap_packet_p); if (handler->eap_ds == NULL) { free(*eap_packet_p); *eap_packet_p = NULL; diff --git a/src/modules/rlm_eap/mem.c b/src/modules/rlm_eap/mem.c index adbbc5345ea..6265b39435a 100644 --- a/src/modules/rlm_eap/mem.c +++ b/src/modules/rlm_eap/mem.c @@ -36,19 +36,15 @@ RCSID("$Id$") #endif /* - * Allocate a new eap_packet_t + * Allocate a new eap_packet_t */ -eap_packet_t *eap_packet_alloc(void) +eap_packet_t *eap_packet_alloc(EAP_DS *eap_ds) { - eap_packet_t *rp; - - rp = rad_malloc(sizeof(eap_packet_t)); - memset(rp, 0, sizeof(eap_packet_t)); - return rp; + return talloc_zero(eap_ds, eap_packet_t); } /* - * Free eap_packet_t + * Free eap_packet_t */ void eap_packet_free(eap_packet_t **eap_packet_ptr) { @@ -75,7 +71,7 @@ void eap_packet_free(eap_packet_t **eap_packet_ptr) eap_packet->packet = NULL; } - free(eap_packet); + talloc_free(eap_packet); *eap_packet_ptr = NULL; } @@ -83,17 +79,16 @@ void eap_packet_free(eap_packet_t **eap_packet_ptr) /* * Allocate a new eap_packet_t */ -EAP_DS *eap_ds_alloc(void) +EAP_DS *eap_ds_alloc(eap_handler_t *handler) { EAP_DS *eap_ds; - eap_ds = rad_malloc(sizeof(EAP_DS)); - memset(eap_ds, 0, sizeof(EAP_DS)); - if ((eap_ds->response = eap_packet_alloc()) == NULL) { + eap_ds = talloc_zero(handler, EAP_DS); + if ((eap_ds->response = eap_packet_alloc(eap_ds)) == NULL) { eap_ds_free(&eap_ds); return NULL; } - if ((eap_ds->request = eap_packet_alloc()) == NULL) { + if ((eap_ds->request = eap_packet_alloc(eap_ds)) == NULL) { eap_ds_free(&eap_ds); return NULL; } @@ -113,7 +108,7 @@ void eap_ds_free(EAP_DS **eap_ds_p) if (eap_ds->response) eap_packet_free(&(eap_ds->response)); if (eap_ds->request) eap_packet_free(&(eap_ds->request)); - free(eap_ds); + talloc_free(eap_ds); *eap_ds_p = NULL; } @@ -124,15 +119,14 @@ eap_handler_t *eap_handler_alloc(rlm_eap_t *inst) { eap_handler_t *handler; - handler = rad_malloc(sizeof(eap_handler_t)); - memset(handler, 0, sizeof(eap_handler_t)); + PTHREAD_MUTEX_LOCK(&(inst->handler_mutex)); + handler = talloc_zero(inst, eap_handler_t); if (inst->handler_tree) { - PTHREAD_MUTEX_LOCK(&(inst->handler_mutex)); rbtree_insert(inst->handler_tree, handler); - PTHREAD_MUTEX_UNLOCK(&(inst->handler_mutex)); - } + PTHREAD_MUTEX_UNLOCK(&(inst->handler_mutex)); + return handler; } @@ -149,12 +143,6 @@ void eap_handler_free(rlm_eap_t *inst, eap_handler_t *handler) if (!handler) return; - if (inst->handler_tree) { - PTHREAD_MUTEX_LOCK(&(inst->handler_mutex)); - rbtree_deletebydata(inst->handler_tree, handler); - PTHREAD_MUTEX_UNLOCK(&(inst->handler_mutex)); - } - if (handler->identity) { free(handler->identity); handler->identity = NULL; @@ -176,7 +164,12 @@ void eap_handler_free(rlm_eap_t *inst, eap_handler_t *handler) if (handler->certs) pairfree(&handler->certs); - free(handler); + PTHREAD_MUTEX_LOCK(&(inst->handler_mutex)); + if (inst->handler_tree) { + rbtree_deletebydata(inst->handler_tree, handler); + } + talloc_free(handler); + PTHREAD_MUTEX_UNLOCK(&(inst->handler_mutex)); } diff --git a/src/modules/rlm_eap/rlm_eap.h b/src/modules/rlm_eap/rlm_eap.h index 586fd5699a5..9e21dfdf76f 100644 --- a/src/modules/rlm_eap/rlm_eap.h +++ b/src/modules/rlm_eap/rlm_eap.h @@ -103,8 +103,8 @@ rlm_rcode_t eap_compose(eap_handler_t *handler); eap_handler_t *eap_handler(rlm_eap_t *inst, eap_packet_raw_t **eap_msg, REQUEST *request); /* Memory Management */ -eap_packet_t *eap_packet_alloc(void); -EAP_DS *eap_ds_alloc(void); +eap_packet_t *eap_packet_alloc(EAP_DS *eap_ds); +EAP_DS *eap_ds_alloc(eap_handler_t *handler); eap_handler_t *eap_handler_alloc(rlm_eap_t *inst); void eap_packet_free(eap_packet_t **eap_packet); void eap_ds_free(EAP_DS **eap_ds); diff --git a/src/modules/rlm_eap/types/rlm_eap_tnc/rlm_eap_tnc.c b/src/modules/rlm_eap/types/rlm_eap_tnc/rlm_eap_tnc.c index 453605f9364..d1614059de1 100644 --- a/src/modules/rlm_eap/types/rlm_eap_tnc/rlm_eap_tnc.c +++ b/src/modules/rlm_eap/types/rlm_eap_tnc/rlm_eap_tnc.c @@ -222,7 +222,7 @@ static int tnc_initiate(void *instance, eap_handler_t *handler) /* * Set connection ID */ - handler->opaque = talloc(NULL, TNC_ConnectionID); + handler->opaque = talloc(handler, TNC_ConnectionID); memcpy(handler->opaque, &conn_id, sizeof(TNC_ConnectionID)); handler->free_opaque = tnc_free;