odhcpd_reload() calls clean_interface() which does a memset() on the
given struct iface from iface->ra onwards, so captive_portal_uri and
captive_portal_uri_len have to be below iface->ra in order to be zeroed
on reload.
Otherwise, iface->captive_portal_uri will be free():d, but
iface->captive_portal_uri_len could still be > 0.
This is a bit of a footgun (one wouldn't normally expect the order of
struct members to matter), and should probably be dealt with in a more
thorough manner, but I've just done the minimum and added a warning in
src/odhcpd.h for now,
Signed-off-by: David Härdeman <david@hardeman.nu>
Link: https://github.com/openwrt/odhcpd/pull/345
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
struct avl_tree dhcpv4_leases;
struct list_head dhcpv4_fr_ips;
- // RFC8910
- char *captive_portal_uri;
- size_t captive_portal_uri_len;
+ /* NOTE: everything from this point is zeroed on odhcpd_reload() */
// Services
enum odhcpd_mode ra;
struct ra_pio *pios;
size_t pio_cnt;
bool pio_update;
+
+ // RFC8910
+ char *captive_portal_uri;
+ size_t captive_portal_uri_len;
};
extern struct avl_tree interfaces;