File bnc721968_9.patch of Package radvd

References: bnc#721968
commit dd8fdaa88643056ce41f6fc68228ac1471f7ce05
Author: Reuben Hawkins <reubenhwk@gmail.com>
Date:   Thu Oct 6 08:37:09 2011 -0700

    properly tracking buffer usage in rdnss

commit 812ade3a8dde2cd9afba4d9f744222ad4c128f33
Author: Reuben Hawkins <reubenhwk@gmail.com>
Date:   Thu Oct 6 08:44:07 2011 -0700

    starting off buffer usage tracking using send_ra_inc_len

commit 0dac8110263c11b1e27c25aa868e2bd8ca3e728c
Author: Reuben Hawkins <reubenhwk@gmail.com>
Date:   Thu Oct 6 08:40:30 2011 -0700

    properly tracking buffer usage in prefix

commit 37ab5a5fa784836d9e8440fc8f36addf2ca5676b
Author: Reuben Hawkins <reubenhwk@gmail.com>
Date:   Thu Oct 6 08:39:43 2011 -0700

    properly tracking buffer usage in route

Index: radvd-1.3/send.c
===================================================================
--- radvd-1.3.orig/send.c	2011-10-19 16:44:44.000000000 +0200
+++ radvd-1.3/send.c	2011-10-19 17:38:18.000000000 +0200
@@ -67,6 +67,17 @@ send_ra_forall(int sock, struct Interfac
 	dlog(LOG_DEBUG, 5, "Not answering request from %s, not configured", address_text);
 }
 
+static void
+send_ra_inc_len(size_t *len, int add)
+{
+        *len += add;
+        if(*len >= MSG_SIZE)
+        {
+                flog(LOG_ERR, "Too many prefixes, routes, rdnss or dnssl to fit in buffer.  Exiting.");
+                exit(1);
+        }
+}
+
 void
 send_ra(int sock, struct Interface *iface, struct in6_addr *dest)
 {
@@ -131,6 +142,8 @@ send_ra(int sock, struct Interface *ifac
 	memset(&buff, 0, sizeof(buff));
 	radvert = (struct nd_router_advert *) buff;
 
+	send_ra_inc_len(&len, sizeof(struct nd_router_advert));
+
 	radvert->nd_ra_type  = ND_ROUTER_ADVERT;
 	radvert->nd_ra_code  = 0;
 	radvert->nd_ra_cksum = 0;
@@ -152,8 +165,6 @@ send_ra(int sock, struct Interface *ifac
 	radvert->nd_ra_reachable  = htonl(iface->AdvReachableTime);
 	radvert->nd_ra_retransmit = htonl(iface->AdvRetransTimer);
 
-	len = sizeof(struct nd_router_advert);
-
 	prefix = iface->AdvPrefixList;
 
 	/*
@@ -168,6 +179,8 @@ send_ra(int sock, struct Interface *ifac
 			
 			pinfo = (struct nd_opt_prefix_info *) (buff + len);
 
+			send_ra_inc_len(&len, sizeof(*pinfo));
+
 			pinfo->nd_opt_pi_type	     = ND_OPT_PREFIX_INFORMATION;
 			pinfo->nd_opt_pi_len	     = 4;
 			pinfo->nd_opt_pi_prefix_len  = prefix->PrefixLen;
@@ -187,7 +200,6 @@ send_ra(int sock, struct Interface *ifac
 			memcpy(&pinfo->nd_opt_pi_prefix, &prefix->Prefix,
 			       sizeof(struct in6_addr));
 
-			len += sizeof(*pinfo);
 		}
 
 		prefix = prefix->next;
@@ -205,6 +217,8 @@ send_ra(int sock, struct Interface *ifac
 		
 		rinfo = (struct nd_opt_route_info_local *) (buff + len);
 
+		send_ra_inc_len(&len, sizeof(*rinfo));
+
 		rinfo->nd_opt_ri_type	     = ND_OPT_ROUTE_INFORMATION;
 		/* XXX: the prefixes are allowed to be sent in smaller chunks as well */
 		rinfo->nd_opt_ri_len	     = 3;
@@ -216,7 +230,6 @@ send_ra(int sock, struct Interface *ifac
 			
 		memcpy(&rinfo->nd_opt_ri_prefix, &route->Prefix,
 		       sizeof(struct in6_addr));
-		len += sizeof(*rinfo);
 
 		route = route->next;
 	}
@@ -233,6 +246,8 @@ send_ra(int sock, struct Interface *ifac
 		
 		rdnssinfo = (struct nd_opt_rdnss_info_local *) (buff + len);
 
+		send_ra_inc_len(&len, sizeof(*rdnssinfo) - (3-rdnss->AdvRDNSSNumber)*sizeof(struct in6_addr));
+
 		rdnssinfo->nd_opt_rdnssi_type	     = ND_OPT_RDNSS_INFORMATION;
 		rdnssinfo->nd_opt_rdnssi_len	     = 1 + 2*rdnss->AdvRDNSSNumber;
 		rdnssinfo->nd_opt_rdnssi_pref_flag_reserved = 
@@ -248,7 +263,6 @@ send_ra(int sock, struct Interface *ifac
 		       sizeof(struct in6_addr));
 		memcpy(&rdnssinfo->nd_opt_rdnssi_addr3, &rdnss->AdvRDNSSAddr3,
 		       sizeof(struct in6_addr));
-		len += sizeof(*rdnssinfo) - (3-rdnss->AdvRDNSSNumber)*sizeof(struct in6_addr);
 
 		rdnss = rdnss->next;
 	}
openSUSE Build Service is sponsored by