changeset 1896:c66c14b42827 draft

Better sanity for working out if our SLA id overflows the PD length + interface id.
author Roy Marples <roy@marples.name>
date Thu, 04 Apr 2013 20:31:05 +0000
parents 64aa7ab6b9b4
children 715ffed82bb6
files dhcp6.c
diffstat 1 files changed, 7 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/dhcp6.c	Thu Apr 04 20:31:04 2013 +0000
+++ b/dhcp6.c	Thu Apr 04 20:31:05 2013 +0000
@@ -1333,7 +1333,7 @@
 {
 	struct dhcp6_state *state;
 	struct ipv6_addr *a, *ap;
-	int b, i, l;
+	int b, i, l, pl, hl;
 	const uint8_t *p;
 	char iabuf[INET6_ADDRSTRLEN];
 	const char *ia;
@@ -1341,9 +1341,11 @@
 	state = D6_STATE(ifp);
 
 	l = prefix->prefix_len + sla->sla_len;
-	if (l < 0 || l > 128) {
-		syslog(LOG_ERR, "%s: invalid prefix length (%d + %d = %d)",
-		    ifs->name, prefix->prefix_len, sla->sla_len, l);
+	hl= (ifp->hwlen * 8) + (2 * 8); /* 2 magic bytes for ethernet */
+	pl = l + hl;
+	if (pl < 0 || pl > 128) {
+		syslog(LOG_ERR, "%s: invalid prefix length (%d + %d + %d = %d)",
+		    ifs->name, prefix->prefix_len, sla->sla_len, hl, pl);
 		return NULL;
 	}
 
@@ -1377,7 +1379,7 @@
 	for (i = 0, b = prefix->prefix_len; b > 0; b -= 8, i++)
 		a->prefix.s6_addr[i] = prefix->prefix.s6_addr[i];
 	p = &sla->sla[3];
-	i = (128 - 64) / 8;
+	i = (128 - hl) / 8;
 	for (b = sla->sla_len; b > 7; b -= 8, p--)
 		a->prefix.s6_addr[--i] = *p;
 	if (b)