const char *file, int line);
static struct dhc6_addr *dhc6_dup_addr(struct dhc6_addr *addr,
const char *file, int line);
-static void dhc6_ia_destroy(struct dhc6_ia *ia, const char *file, int line);
+static void dhc6_ia_destroy(struct dhc6_ia **src, const char *file, int line);
static isc_result_t dhc6_parse_ia_na(struct dhc6_ia **pia,
struct packet *packet,
struct option_state *options);
*insert_ia = dhc6_dup_ia(ia, file, line);
if (*insert_ia == NULL) {
- dhc6_lease_destroy(copy, file, line);
+ dhc6_lease_destroy(©, file, line);
return NULL;
}
*insert_addr = dhc6_dup_addr(addr, file, line);
if (*insert_addr == NULL) {
- dhc6_ia_destroy(copy, file, line);
+ dhc6_ia_destroy(©, file, line);
return NULL;
}
log_error("Invalid length of DHCPv6 Preference option "
"(%d != 1)", ds.len);
data_string_forget(&ds, MDL);
- dhc6_lease_destroy(lease, MDL);
+ dhc6_lease_destroy(&lease, MDL);
return NULL;
} else {
lease->pref = ds.data[0];
if (dhc6_parse_ia_na(&lease->bindings, packet,
lease->options) != ISC_R_SUCCESS) {
/* Error conditions are logged by the caller. */
- dhc6_lease_destroy(lease, MDL);
+ dhc6_lease_destroy(&lease, MDL);
return NULL;
}
/* This should be impossible due to validation checks earlier.
*/
log_error("Invalid SERVERID option cache.");
- dhc6_lease_destroy(lease, MDL);
+ dhc6_lease_destroy(&lease, MDL);
return NULL;
} else {
log_debug("RCV: X-- Server ID: %s",
return ISC_R_SUCCESS;
}
-/* Clean up a lease object and deallocate all its parts. */
+/* Clean up a lease object, deallocate all its parts, and set it to NULL. */
void
-dhc6_lease_destroy(struct dhc6_lease *lease, const char *file, int line)
+dhc6_lease_destroy(struct dhc6_lease **src, const char *file, int line)
{
struct dhc6_ia *ia, *nia;
+ struct dhc6_lease *lease;
- /* no-op */
- if (lease == NULL)
+ if (src == NULL || *src == NULL) {
+ log_error("Attempt to destroy null lease.");
return;
+ }
+ lease = *src;
if (lease->server_id.len != 0)
data_string_forget(&lease->server_id, file, line);
for (ia = lease->bindings ; ia != NULL ; ia = nia) {
nia = ia->next;
- dhc6_ia_destroy(ia, file, line);
+ dhc6_ia_destroy(&ia, file, line);
}
if (lease->options != NULL)
option_state_dereference(&lease->options, file, line);
dfree(lease, file, line);
+ *src = NULL;
}
-/* Traverse the addresses list, and destroy their contents. */
+/*
+ * Traverse the addresses list, and destroy their contents, and NULL the
+ * list pointer.
+ */
static void
-dhc6_ia_destroy(struct dhc6_ia *ia, const char *file, int line)
+dhc6_ia_destroy(struct dhc6_ia **src, const char *file, int line)
{
struct dhc6_addr *addr, *naddr;
+ struct dhc6_ia *ia;
+
+ if (src == NULL || *src == NULL) {
+ log_error("Attempt to destroy null IA.");
+ return;
+ }
+ is = *src;
for (addr = ia->addrs ; addr != NULL ; addr = naddr) {
naddr = addr->next;
option_state_dereference(&ia->options, file, line);
dfree(ia, file, line);
+ *src = NULL;
}
/* For a given lease, insert it into the tail of the lease list. Upon
memcmp((*head)->server_id.data, new->server_id.data,
new->server_id.len) == 0) {
new->next = (*head)->next;
- dhc6_lease_destroy(*head, MDL);
+ dhc6_lease_destroy(head, MDL);
break;
}
switch(code) {
case STATUS_Success:
- msg = "Succes";
+ msg = "Success";
break;
case STATUS_UnspecFail:
default:
case STATUS_UnspecFail:
if (client->advertised_leases != NULL) {
- dhc6_lease_destroy(client->selected_lease, MDL);
+ dhc6_lease_destroy(&client->selected_lease, MDL);
client->selected_lease = NULL;
start_selecting6(client);
if (client->selected_lease == NULL)
log_fatal("Impossible case at %s:%d.", MDL);
- dhc6_lease_destroy(client->selected_lease, MDL);
+ dhc6_lease_destroy(&client->selected_lease, MDL);
client->selected_lease = NULL;
if (client->advertised_leases != NULL)
if (client->active_lease == NULL)
log_fatal("Impossible case at %s:%d.", MDL);
- dhc6_lease_destroy(client->active_lease, MDL);
+ dhc6_lease_destroy(&client->active_lease, MDL);
} else {
if (client->selected_lease == NULL)
log_fatal("Impossible case at %s:%d.", MDL);
- dhc6_lease_destroy(client->selected_lease, MDL);
+ dhc6_lease_destroy(&client->selected_lease, MDL);
client->selected_lease = NULL;
while (client->advertised_leases != NULL) {
lease = client->advertised_leases;
client->advertised_leases = lease->next;
- dhc6_lease_destroy(lease, MDL);
+ dhc6_lease_destroy(&lease, MDL);
}
}
"Trying other servers.",
nscore, sscore);
- dhc6_lease_destroy(client->selected_lease, MDL);
+ dhc6_lease_destroy(&client->selected_lease, MDL);
client->selected_lease = NULL;
start_selecting6(client);
if (dhc6_check_advertise(lease) != ISC_R_SUCCESS) {
log_debug("PRC: Lease failed to satisfy.");
- dhc6_lease_destroy(lease, MDL);
+ dhc6_lease_destroy(&lease, MDL);
return;
}
lease->server_id.data, 56));
/* Get rid of the lease that timed/counted out. */
- dhc6_lease_destroy(lease, MDL);
+ dhc6_lease_destroy(&lease, MDL);
client->selected_lease = NULL;
/* If there are more leases great. If not, get more. */
check_status = dhc6_check_reply(client, lease);
if (check_status != ISC_R_SUCCESS) {
- dhc6_lease_destroy(lease, MDL);
+ dhc6_lease_destroy(&lease, MDL);
/* If no action was taken, but there is an error, then
* we wait for a retransmission.
return;
if (client->selected_lease != NULL) {
- dhc6_lease_destroy(client->selected_lease, MDL);
+ dhc6_lease_destroy(&client->selected_lease, MDL);
client->selected_lease = NULL;
}
if (client->active_lease == NULL)
log_fatal("Impossible condition at %s:%d.", MDL);
- dhc6_lease_destroy(client->active_lease, MDL);
+ dhc6_lease_destroy(&client->active_lease, MDL);
client->active_lease = NULL;
return;
}
if (client->active_lease == NULL)
log_fatal("Impossible condition at %s:%d.", MDL);
- dhc6_lease_destroy(lease, MDL);
+ dhc6_lease_destroy(&lease, MDL);
start_bound(client);
return;
}
/* Cleanup if a previous attempt to go bound failed. */
if (client->old_lease != NULL) {
- dhc6_lease_destroy(client->old_lease, MDL);
+ dhc6_lease_destroy(&client->old_lease, MDL);
client->old_lease = NULL;
}
lease = client->advertised_leases;
client->advertised_leases = lease->next;
- dhc6_lease_destroy(lease, MDL);
+ dhc6_lease_destroy(&lease, MDL);
}
start_bound(client);
* schedule a future request (using 4-pkt info-request model).
*/
if (has_addrs == ISC_FALSE) {
- dhc6_lease_destroy(client->active_lease, MDL);
+ dhc6_lease_destroy(&client->active_lease, MDL);
client->active_lease = NULL;
/* Go back to the beginning. */
go_daemon();
if (client->old_lease != NULL) {
- dhc6_lease_destroy(client->old_lease, MDL);
+ dhc6_lease_destroy(&client->old_lease, MDL);
client->old_lease = NULL;
}
log_info("PRC: Bound lease is devoid of active addresses."
" Re-initializing.");
- dhc6_lease_destroy(lease, MDL);
+ dhc6_lease_destroy(&lease, MDL);
client->active_lease = NULL;
start_init6(client);