struct lease *lease;
list_for_each_entry(lease, &leases, head) {
// Construct entry
- struct dhcpv6_assignment *a = calloc(1, sizeof(*a) + lease->duid_len);
+ size_t duid_len = lease->duid_len ? lease->duid_len : 14;
+ struct dhcpv6_assignment *a = calloc(1, sizeof(*a) + duid_len);
if (!a) {
syslog(LOG_ERR, "Calloc failed for static lease assignment on interface %s",
iface->ifname);
return -1;
}
- a->clid_len = lease->duid_len;
+ a->clid_len = duid_len;
a->length = 128;
if (lease->hostid) {
a->assigned = lease->hostid;
a->assigned = ((i4a / 100) << 8) | (((i4a % 100) / 10) << 4) | (i4a % 10);
}
odhcpd_urandom(a->key, sizeof(a->key));
- memcpy(a->clid_data, lease->duid, a->clid_len);
+ memcpy(a->clid_data, lease->duid, lease->duid_len);
memcpy(a->mac, lease->mac.ether_addr_octet, sizeof(a->mac));
// Assign to all interfaces
int minprefix = -1;
for (size_t i = 0; i < iface->ia_addr_len; ++i) {
- if (iface->ia_addr[i].preferred > now &&
+ if (iface->ia_addr[i].preferred > (uint32_t)now &&
iface->ia_addr[i].prefix < 64 &&
iface->ia_addr[i].prefix > minprefix)
minprefix = iface->ia_addr[i].prefix;
size_t entrlen = sizeof(n) - 4;
if (iface->managed < RELAYD_MANAGED_NO_AFLAG && i != m &&
- addrs[i].prefix == 64)
+ addrs[i].prefix <= 64)
continue;
if (datalen + entrlen + 4 > buflen || a->assigned == 0)