odhcpd: fix captive_portal_uri reset master
authorDavid Härdeman <david@hardeman.nu>
Fri, 12 Dec 2025 21:46:31 +0000 (22:46 +0100)
committerÁlvaro Fernández Rojas <noltari@gmail.com>
Sat, 13 Dec 2025 10:43:52 +0000 (11:43 +0100)
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>
src/odhcpd.h

index 7b6ac6c8cc0412291ebf7bdc54a23fc4386fad96..86375abaa4b6eb613cf631a6050af73c6e9b70b7 100644 (file)
@@ -391,9 +391,7 @@ struct interface {
        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;
@@ -494,6 +492,10 @@ struct interface {
        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;