From: Steven Barth Date: Mon, 13 Jul 2015 14:15:52 +0000 (+0200) Subject: Merge pull request #37 from themiron/master X-Git-Tag: debian/1.1+git20160131-1~11 X-Git-Url: https://git.decadent.org.uk/gitweb/?p=odhcp6c.git;a=commitdiff_plain;h=024525798c5f6aba3af9b2ef7b3af2f3c14f1db8;hp=523431acff2f8afc2309c2e17b3add83d03125dc Merge pull request #37 from themiron/master Avoid solicit for zero-length prefix --- diff --git a/src/dhcpv6.c b/src/dhcpv6.c index cc28627..cfa3f29 100644 --- a/src/dhcpv6.c +++ b/src/dhcpv6.c @@ -272,17 +272,21 @@ static void dhcpv6_send(enum dhcpv6_msg type, uint8_t trid[3], uint32_t ecs) for (size_t i = 0; i < n_prefixes; i++) { struct dhcpv6_ia_hdr hdr_ia_pd = { htons(DHCPV6_OPT_IA_PD), - htons(sizeof(hdr_ia_pd) - 4 + sizeof(struct dhcpv6_ia_prefix)), + htons(sizeof(hdr_ia_pd) - 4 + + sizeof(struct dhcpv6_ia_prefix) * !!request_prefixes[i].length), request_prefixes[i].iaid, 0, 0 }; struct dhcpv6_ia_prefix pref = { .type = htons(DHCPV6_OPT_IA_PREFIX), - .len = htons(25), .prefix = request_prefixes[i].length + .len = htons(sizeof(pref) - 4), + .prefix = request_prefixes[i].length }; memcpy(ia_pd + ia_pd_len, &hdr_ia_pd, sizeof(hdr_ia_pd)); ia_pd_len += sizeof(hdr_ia_pd); - memcpy(ia_pd + ia_pd_len, &pref, sizeof(pref)); - ia_pd_len += sizeof(pref); + if (request_prefixes[i].length) { + memcpy(ia_pd + ia_pd_len, &pref, sizeof(pref)); + ia_pd_len += sizeof(pref); + } } } else { struct odhcp6c_entry *e = odhcp6c_get_state(STATE_IA_PD, &ia_pd_entries);