Fix removal of DHCP_CLIENT_MAC options from DHCPv6 relay replies.

This commit is contained in:
Simon Kelley
2019-01-10 21:58:18 +00:00
parent 4bf62f616b
commit f8c77edbdf

View File

@@ -219,21 +219,25 @@ static int dhcp6_maybe_relay(struct state *state, void *inbuff, size_t sz,
if (opt6_ptr(opt, 0) + opt6_len(opt) > end) if (opt6_ptr(opt, 0) + opt6_len(opt) > end)
return 0; return 0;
int o = new_opt6(opt6_type(opt)); /* Don't copy MAC address into reply. */
if (opt6_type(opt) == OPTION6_RELAY_MSG) if (opt6_type(opt) != OPTION6_CLIENT_MAC)
{ {
struct in6_addr align; int o = new_opt6(opt6_type(opt));
/* the packet data is unaligned, copy to aligned storage */ if (opt6_type(opt) == OPTION6_RELAY_MSG)
memcpy(&align, inbuff + 2, IN6ADDRSZ); {
state->link_address = &align; struct in6_addr align;
/* zero is_unicast since that is now known to refer to the /* the packet data is unaligned, copy to aligned storage */
relayed packet, not the original sent by the client */ memcpy(&align, inbuff + 2, IN6ADDRSZ);
if (!dhcp6_maybe_relay(state, opt6_ptr(opt, 0), opt6_len(opt), client_addr, 0, now)) state->link_address = &align;
return 0; /* zero is_unicast since that is now known to refer to the
relayed packet, not the original sent by the client */
if (!dhcp6_maybe_relay(state, opt6_ptr(opt, 0), opt6_len(opt), client_addr, 0, now))
return 0;
}
else
put_opt6(opt6_ptr(opt, 0), opt6_len(opt));
end_opt6(o);
} }
else if (opt6_type(opt) != OPTION6_CLIENT_MAC)
put_opt6(opt6_ptr(opt, 0), opt6_len(opt));
end_opt6(o);
} }
return 1; return 1;