From: Ken-ichirou MATSUZAWA Date: Tue, 8 Feb 2011 12:19:10 +0000 (+0900) Subject: fix freeing eap_handler as opaque (and typo) X-Git-Tag: release_2_1_11~134 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4dbb466b6526c0dacdcf36949bbdaa38416a1be2;p=thirdparty%2Ffreeradius-server.git fix freeing eap_handler as opaque (and typo) Hello, I hope this would be hint for fixing segfault and better solution. Thanks. Subject: [PATCH 1/2] freeing EAP opaque with one arg --- diff --git a/src/modules/rlm_eap/eap.h b/src/modules/rlm_eap/eap.h index 0150ef2b863..6d845ad7745 100644 --- a/src/modules/rlm_eap/eap.h +++ b/src/modules/rlm_eap/eap.h @@ -107,6 +107,7 @@ typedef struct _eap_handler { void *opaque; void (*free_opaque)(void *opaque); + void *inst_holder; int status; diff --git a/src/modules/rlm_eap/mem.c b/src/modules/rlm_eap/mem.c index da2f622fa50..21024ef29fe 100644 --- a/src/modules/rlm_eap/mem.c +++ b/src/modules/rlm_eap/mem.c @@ -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) diff --git a/src/modules/rlm_eap/rlm_eap.c b/src/modules/rlm_eap/rlm_eap.c index 07ee7eccebe..25c0b863091 100644 --- a/src/modules/rlm_eap/rlm_eap.c +++ b/src/modules/rlm_eap/rlm_eap.c @@ -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); /* diff --git a/src/modules/rlm_eap/rlm_eap.h b/src/modules/rlm_eap/rlm_eap.h index 84b4b500092..0de2ae60997 100644 --- a/src/modules/rlm_eap/rlm_eap.h +++ b/src/modules/rlm_eap/rlm_eap.h @@ -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); diff --git a/src/modules/rlm_eap/types/rlm_eap_peap/peap.c b/src/modules/rlm_eap/types/rlm_eap_peap/peap.c index f695f3cfca2..0ddf1ed7361 100644 --- a/src/modules/rlm_eap/types/rlm_eap_peap/peap.c +++ b/src/modules/rlm_eap/types/rlm_eap_peap/peap.c @@ -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;