]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
fix freeing eap_handler as opaque (and typo)
authorKen-ichirou MATSUZAWA <chamas@h4.dion.ne.jp>
Tue, 8 Feb 2011 12:19:10 +0000 (21:19 +0900)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 8 Feb 2011 13:16:55 +0000 (14:16 +0100)
 Hello,

I hope this would be hint for fixing segfault and
better solution.

Thanks.

Subject: [PATCH 1/2] freeing EAP opaque with one arg

src/modules/rlm_eap/eap.h
src/modules/rlm_eap/mem.c
src/modules/rlm_eap/rlm_eap.c
src/modules/rlm_eap/rlm_eap.h
src/modules/rlm_eap/types/rlm_eap_peap/peap.c

index 0150ef2b8637deb968b3a14745d2b4d0507a8d0a..6d845ad77456fb31afe0fb33434422df7cb52f88 100644 (file)
@@ -107,6 +107,7 @@ typedef struct _eap_handler {
 
        void            *opaque;
        void            (*free_opaque)(void *opaque);
+       void            *inst_holder;
 
        int             status;
 
index da2f622fa5027e51f4385ae19f6a4627f8859392..21024ef29fe1e3d1dec4d16ef163621a26f483d3 100644 (file)
@@ -136,6 +136,14 @@ EAP_HANDLER *eap_handler_alloc(rlm_eap_t *inst)
        return handler;
 }
 
+void eap_opaque_free(EAP_HANDLER *handler)
+{
+       if (!handler)
+               return;
+
+       eap_handler_free(handler->inst_holder, handler);
+}
+
 void eap_handler_free(rlm_eap_t *inst, EAP_HANDLER *handler)
 {
        if (!handler)
index 07ee7eccebe710ca242df6260d942d700cd4bc5c..25c0b8630919b342d80b95d6ba839982f1f4f131 100644 (file)
@@ -347,10 +347,11 @@ static int eap_authenticate(void *instance, REQUEST *request)
                 *      can retrieve it in the post-proxy stage, and
                 *      send a response.
                 */
+               handler->inst_holder = inst;
                rcode = request_data_add(request,
                                         inst, REQUEST_DATA_EAP_HANDLER,
                                         handler,
-                                        (void *) eap_handler_free);
+                                        (void *) eap_opaque_free);
                rad_assert(rcode == 0);
 
                return RLM_MODULE_HANDLED;
@@ -372,10 +373,11 @@ static int eap_authenticate(void *instance, REQUEST *request)
                 *      can retrieve it in the post-proxy stage, and
                 *      send a response.
                 */
+               handler->inst_holder = inst;
                rcode = request_data_add(request,
                                         inst, REQUEST_DATA_EAP_HANDLER,
                                         handler,
-                                        (void *) eap_handler_free);
+                                        (void *) eap_opaque_free);
                rad_assert(rcode == 0);
 
                /*
index 84b4b500092d753484515bfaa44f8f63532ee6ab..0de2ae609970df57b0d6c33166b5f069512f5607 100644 (file)
@@ -105,6 +105,7 @@ EAP_DS              *eap_ds_alloc(void);
 EAP_HANDLER    *eap_handler_alloc(rlm_eap_t *inst);
 void           eap_packet_free(EAP_PACKET **eap_packet);
 void           eap_ds_free(EAP_DS **eap_ds);
+void           eap_opaque_free(EAP_HANDLER *handler);
 void           eap_handler_free(rlm_eap_t *inst, EAP_HANDLER *handler);
 
 int            eaplist_add(rlm_eap_t *inst, EAP_HANDLER *handler);
index f695f3cfca2344e38f8c6598726c0bfca89c8b85..0ddf1ed73619ba43113156cf64352717e89f0f14 100644 (file)
@@ -1128,8 +1128,8 @@ int eappeap_process(EAP_HANDLER *handler, tls_session_t *tls_session)
                        request->proxy = fake->packet;
                        memset(&request->proxy->src_ipaddr, 0,
                               sizeof(request->proxy->src_ipaddr));
-                       memset(&request->proxy->src_ipaddr, 0,
-                              sizeof(request->proxy->src_ipaddr));
+                       memset(&request->proxy->dst_ipaddr, 0,
+                              sizeof(request->proxy->dst_ipaddr));
                        request->proxy->src_port = 0;
                        request->proxy->dst_port = 0;
                        fake->packet = NULL;