Hi,

I manually created a patch for this commit (see attach). I also applied the patch to the latest Debian package. You can find a build for amd64 at http://homes.esat.kuleuven.be/~rtheys/freeradius.

I have not tested the resulting package, but the patch applied cleanly and there were no build errors.

To reproduce the packaging:

apt-get install build-essential
apt-get build-dep freeradius
apt-get source freeradius
cd freeradius-2.1.10+dfsg
copy the attached patch to the debian/patches directory
echo "fix-freeing-eap_handler.diff" >> debian/patches/series
add an entry to debian/changelog
dpkg-buildpackage

I believe the same instructions should work for the squeeze version of freeradius.

If you have time, please test the updated package/patch to see if it resolves the issue you are seeing, and update the bug report with your info.

Regards,

Rik
diff -ur freeradius-2.1.10+dfsg.orig/src/modules/rlm_eap/eap.h freeradius-2.1.10+dfsg/src/modules/rlm_eap/eap.h
--- freeradius-2.1.10+dfsg.orig/src/modules/rlm_eap/eap.h	2010-09-28 13:03:56.000000000 +0200
+++ freeradius-2.1.10+dfsg/src/modules/rlm_eap/eap.h	2012-06-05 09:39:58.978878670 +0200
@@ -107,6 +107,7 @@
 
 	void 		*opaque;
 	void 		(*free_opaque)(void *opaque);
+	void		*inst_holder;
 
 	int		status;
 
diff -ur freeradius-2.1.10+dfsg.orig/src/modules/rlm_eap/mem.c freeradius-2.1.10+dfsg/src/modules/rlm_eap/mem.c
--- freeradius-2.1.10+dfsg.orig/src/modules/rlm_eap/mem.c	2010-09-28 13:03:56.000000000 +0200
+++ freeradius-2.1.10+dfsg/src/modules/rlm_eap/mem.c	2012-06-05 09:41:28.288350283 +0200
@@ -128,6 +128,14 @@
 	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 -ur freeradius-2.1.10+dfsg.orig/src/modules/rlm_eap/rlm_eap.c freeradius-2.1.10+dfsg/src/modules/rlm_eap/rlm_eap.c
--- freeradius-2.1.10+dfsg.orig/src/modules/rlm_eap/rlm_eap.c	2010-09-28 13:03:56.000000000 +0200
+++ freeradius-2.1.10+dfsg/src/modules/rlm_eap/rlm_eap.c	2012-06-05 09:42:21.056350259 +0200
@@ -342,7 +342,7 @@
 		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;
@@ -367,7 +367,7 @@
 		rcode = request_data_add(request,
 					 inst, REQUEST_DATA_EAP_HANDLER,
 					 handler,
-					 (void *) eap_handler_free);
+					 (void *) eap_opaque_free);
 		rad_assert(rcode == 0);
 
 		/*
diff -ur freeradius-2.1.10+dfsg.orig/src/modules/rlm_eap/rlm_eap.h freeradius-2.1.10+dfsg/src/modules/rlm_eap/rlm_eap.h
--- freeradius-2.1.10+dfsg.orig/src/modules/rlm_eap/rlm_eap.h	2010-09-28 13:03:56.000000000 +0200
+++ freeradius-2.1.10+dfsg/src/modules/rlm_eap/rlm_eap.h	2012-06-05 09:43:14.768350275 +0200
@@ -105,6 +105,7 @@
 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 -ur freeradius-2.1.10+dfsg.orig/src/modules/rlm_eap/types/rlm_eap_peap/peap.c freeradius-2.1.10+dfsg/src/modules/rlm_eap/types/rlm_eap_peap/peap.c
--- freeradius-2.1.10+dfsg.orig/src/modules/rlm_eap/types/rlm_eap_peap/peap.c	2010-09-28 13:03:56.000000000 +0200
+++ freeradius-2.1.10+dfsg/src/modules/rlm_eap/types/rlm_eap_peap/peap.c	2012-06-05 09:45:32.340350411 +0200
@@ -1075,8 +1075,8 @@
 			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;

Reply via email to