File 0006-strongswan-4.6.4-bnc-840826-recursion-limit.patch of Package strongswan.openSUSE_12.2_Update

From e07204b6f051449ea9ca77e9e3a935ded3662220 Mon Sep 17 00:00:00 2001
From: Marius Tomaschewski <mt@suse.de>
Date: Wed, 30 Oct 2013 18:03:35 +0100
References: bnc#840826
Upstream: yes
Subject: [PATCH] strongswan-4.6.4 bnc#840826 recursion limit

Added a recursion limit to get_route in netlink plugin to avoid
a charon crash while trying to find a source address when local
left is set to %any.
---
 .../plugins/kernel_netlink/kernel_netlink_net.c    | 23 ++++++++++++++++------
 1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c b/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c
index cce0ff4..743decf 100644
--- a/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c
+++ b/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c
@@ -58,6 +58,9 @@
 /** delay before firing roam events (ms) */
 #define ROAM_DELAY 100
 
+/** maximum recursion when searching for addresses in get_route() */
+#define MAX_ROUTE_RECURSION 2
+
 typedef struct addr_entry_t addr_entry_t;
 
 /**
@@ -852,7 +855,7 @@ static bool addr_in_subnet(chunk_t addr, chunk_t net, int net_len)
  * Get a route: If "nexthop", the nexthop is returned. source addr otherwise.
  */
 static host_t *get_route(private_kernel_netlink_net_t *this, host_t *dest,
-						 bool nexthop, host_t *candidate)
+						 bool nexthop, host_t *candidate, u_int recursion)
 {
 	netlink_buf_t request;
 	struct nlmsghdr *hdr, *out, *current;
@@ -863,7 +866,13 @@ static host_t *get_route(private_kernel_netlink_net_t *this, host_t *dest,
 	enumerator_t *enumerator;
 	host_t *src = NULL, *gtw = NULL;
 
-	DBG2(DBG_KNL, "getting address to reach %H", dest);
+	if (recursion > MAX_ROUTE_RECURSION)
+	{
+		return NULL;
+	}
+
+	DBG2(DBG_KNL, "getting %s to reach %H",
+			nexthop ? "nexthop" : "address", dest);
 
 	memset(&request, 0, sizeof(request));
 
@@ -891,7 +900,8 @@ static host_t *get_route(private_kernel_netlink_net_t *this, host_t *dest,
 
 	if (this->socket->send(this->socket, hdr, &out, &len) != SUCCESS)
 	{
-		DBG1(DBG_KNL, "getting address to %H failed", dest);
+		DBG1(DBG_KNL, "getting %s to reach %H failed",
+				nexthop ? "nexthop" : "address", dest);
 		return NULL;
 	}
 	this->mutex->lock(this->mutex);
@@ -1021,7 +1031,8 @@ static host_t *get_route(private_kernel_netlink_net_t *this, host_t *dest,
 				if (rta_gtw.ptr)
 				{	/* no source, but a gateway. Lookup source to reach gtw. */
 					new_gtw = host_create_from_chunk(msg->rtm_family, rta_gtw, 0);
-					new_src = get_route(this, new_gtw, FALSE, candidate);
+					new_src = get_route(this, new_gtw, FALSE, candidate,
+								recursion + 1);
 					new_gtw->destroy(new_gtw);
 					if (new_src)
 					{
@@ -1055,13 +1066,13 @@ static host_t *get_route(private_kernel_netlink_net_t *this, host_t *dest,
 METHOD(kernel_net_t, get_source_addr, host_t*,
 	private_kernel_netlink_net_t *this, host_t *dest, host_t *src)
 {
-	return get_route(this, dest, FALSE, src);
+	return get_route(this, dest, FALSE, src, 0);
 }
 
 METHOD(kernel_net_t, get_nexthop, host_t*,
 	private_kernel_netlink_net_t *this, host_t *dest)
 {
-	return get_route(this, dest, TRUE, NULL);
+	return get_route(this, dest, TRUE, NULL, 0);
 }
 
 /**
-- 
1.8.4

openSUSE Build Service is sponsored by