]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Move EAP handler, EAP_DS, eap_packet_t to use talloc
authorAlan T. DeKok <aland@freeradius.org>
Sun, 17 Mar 2013 03:09:25 +0000 (23:09 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Sun, 17 Mar 2013 03:09:25 +0000 (23:09 -0400)
src/modules/rlm_eap/eap.c
src/modules/rlm_eap/mem.c
src/modules/rlm_eap/rlm_eap.h
src/modules/rlm_eap/types/rlm_eap_tnc/rlm_eap_tnc.c

index 95829dd35692fe73eed8d327fb5dbaade57ade5e..35a0ab72bf8b0a57cc10efaf9199387dd5691e9d 100644 (file)
@@ -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;
index adbbc5345eafcd8e4c7879bbaa55ced9e858baac..6265b39435ab963247b08eade7d7efcee5ab6ed0 100644 (file)
@@ -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));
 }
 
 
index 586fd5699a531e79d7363ed41a8525b0c4cc61bf..9e21dfdf76fa73155bf2d1bf47bd74aced0164ef 100644 (file)
@@ -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);
index 453605f9364183715224c9bd2c7643cca5783dca..d1614059de14bc62d65739c41785fc275898e758 100644 (file)
@@ -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;