# HG changeset patch # User Roy Marples # Date 1590612545 -3600 # Node ID 3a33b39120eb2524680ffcb8927f92fc9b7e7d11 # Parent 97e87c65302ea66aa3027f3703e763be80eb5ccb DHCP6: Use interface vendorclassid rather than context This allows the vendor class to be turned off as well. diff -r 97e87c65302e -r 3a33b39120eb src/dhcp6.c --- a/src/dhcp6.c Wed May 27 15:53:21 2020 +0000 +++ b/src/dhcp6.c Wed May 27 21:49:05 2020 +0100 @@ -262,21 +262,22 @@ size_t len, vlen, i; uint8_t *p; const struct vivco *vivco; - char vendor[VENDORCLASSID_MAX_LEN]; struct dhcp6_option o; ifo = ifp->options; len = sizeof(uint32_t); /* IANA PEN */ if (ifo->vivco_en) { + vlen = 0; for (i = 0, vivco = ifo->vivco; i < ifo->vivco_len; i++, vivco++) - len += sizeof(uint16_t) + vivco->len; - vlen = 0; /* silence bogus gcc warning */ - } else { - vlen = strlcpy(vendor, ifp->ctx->vendor, sizeof(vendor)); + vlen += sizeof(uint16_t) + vivco->len; + len += vlen; + } else if (ifo->vendorclassid[0] != '\0') { + vlen = (size_t)ifo->vendorclassid[0]; len += sizeof(uint16_t) + vlen; - } + } else + return 0; if (len > UINT16_MAX) { logerrx("%s: DHCPv6 Vendor Class too big", ifp->name); @@ -307,11 +308,11 @@ memcpy(p, vivco->data, vivco->len); p += vivco->len; } - } else if (vlen) { + } else if (ifo->vendorclassid[0] != '\0') { hvlen = htons((uint16_t)vlen); memcpy(p, &hvlen, sizeof(hvlen)); p += sizeof(hvlen); - memcpy(p, vendor, (size_t)vlen); + memcpy(p, ifo->vendorclassid + 1, (size_t)vlen); } }