$OpenBSD: patch-src_modules_rlm_replicate_rlm_replicate_c,v 1.1 2015/01/03 13:20:25 sthen Exp $

From 7882804109b4d4ccde8078df8a9243b991595f11 Mon Sep 17 00:00:00 2001
From: "Alan T. DeKok" <aland@freeradius.org>
Date: Fri, 12 Dec 2014 12:04:22 -0500
Subject: [PATCH] Don't free packet twice

--- src/modules/rlm_replicate/rlm_replicate.c.orig	Tue Nov 18 19:56:52 2014
+++ src/modules/rlm_replicate/rlm_replicate.c	Fri Jan  2 22:40:02 2015
@@ -29,11 +29,11 @@ RCSID("$Id: patch-src_modules_rlm_replicate_rlm_replicate_c,v 1.1 2015/01/03 13:20:25 sthen Exp $
 #include <freeradius-devel/rad_assert.h>
 
 
-static void cleanup(RADIUS_PACKET *packet)
+static void cleanup(RADIUS_PACKET **packet)
 {
-	if (!packet) return;
-	if (packet->sockfd >= 0) close(packet->sockfd);
-	rad_free(&packet);
+	if (!packet || !*packet) return;
+	if ((*packet)->sockfd >= 0) close((*packet)->sockfd);
+	rad_free(packet);
 }
 
 /*
@@ -77,7 +77,7 @@ static int replicate_packet(void *instance, REQUEST *r
 			pool = NULL;
 			RDEBUG2("ERROR: Cannot replicate unknown packet code %d",
 				request->packet->code);
-			cleanup(packet);
+			cleanup(&packet);
 			rcode = RLM_MODULE_FAIL;
 			break;
 		
@@ -125,7 +125,7 @@ static int replicate_packet(void *instance, REQUEST *r
 			packet->sockfd = fr_socket(&home->src_ipaddr, 0);
 			if (packet->sockfd < 0) {
 				RDEBUG("ERROR: Failed opening socket: %s", fr_strerror());
-				cleanup(packet);
+				cleanup(&packet);
 				rcode = RLM_MODULE_FAIL;
 				break;
 			}
@@ -133,7 +133,7 @@ static int replicate_packet(void *instance, REQUEST *r
 			packet->vps = paircopy(request->packet->vps);
 			if (!packet->vps) {
 				RDEBUG("ERROR: Out of memory!");
-				cleanup(packet);
+				cleanup(&packet);
 				rcode = RLM_MODULE_FAIL;
 				break;
 			}
@@ -180,7 +180,7 @@ static int replicate_packet(void *instance, REQUEST *r
 		if (rad_send(packet, NULL, home->secret) < 0) {
 			RDEBUG("ERROR: Failed replicating packet: %s",
 			       fr_strerror());
-			cleanup(packet);
+			cleanup(&packet);
 			rcode = RLM_MODULE_FAIL;
 			break;
 		}
@@ -191,7 +191,7 @@ static int replicate_packet(void *instance, REQUEST *r
 		rcode = RLM_MODULE_OK;
 	}
 
-	cleanup(packet);
+	cleanup(&packet);
 	rad_free(&request->proxy);
 
 	return rcode;
