Mercurial > hg > dhcpcd
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)
