X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=src%2Fodhcp6c.c;h=d47e17c158ab1b8d2ffe4026954d8a4e6e934793;hb=74ef11cad687fd165457f212cfe15bc5ad7a2cd1;hp=6da604728c4f330d446e10c5c0e941c6ce529d65;hpb=eb0b01e94374774609c31ab4508d8cfca8a400e1;p=odhcp6c.git diff --git a/src/odhcp6c.c b/src/odhcp6c.c index 6da6047..d47e17c 100644 --- a/src/odhcp6c.c +++ b/src/odhcp6c.c @@ -192,7 +192,7 @@ int main(_unused int argc, char* const argv[]) while (do_signal != SIGTERM) { // Main logic odhcp6c_clear_state(STATE_SERVER_ID); - odhcp6c_clear_state(STATE_SERVER_CAND); + odhcp6c_clear_state(STATE_IA_NA); odhcp6c_clear_state(STATE_IA_PD); odhcp6c_clear_state(STATE_SNTP_IP); odhcp6c_clear_state(STATE_SNTP_FQDN); @@ -201,6 +201,15 @@ int main(_unused int argc, char* const argv[]) dhcpv6_set_ia_na_mode(ia_na_mode); bound = false; + // Server candidates need deep-delete + size_t cand_len; + struct dhcpv6_server_cand *cand = odhcp6c_get_state(STATE_SERVER_CAND, &cand_len); + for (size_t i = 0; i < cand_len / sizeof(*cand); ++i) { + free(cand[i].ia_na); + free(cand[i].ia_pd); + } + odhcp6c_clear_state(STATE_SERVER_CAND); + syslog(LOG_NOTICE, "(re)starting transaction on %s", ifname); do_signal = 0; @@ -405,6 +414,18 @@ size_t odhcp6c_remove_state(enum odhcp6c_state state, size_t offset, size_t len) } +void* odhcp6c_move_state(enum odhcp6c_state state, size_t *len) +{ + *len = state_len[state]; + void *data = state_data[state]; + + state_len[state] = 0; + state_data[state] = NULL; + + return data; +} + + void* odhcp6c_get_state(enum odhcp6c_state state, size_t *len) { *len = state_len[state];