The semantic of most free methods is to free a pointer and all its
contents and also free the pointer itself. Align reliable_free to this
semantic.
Also clean up the other free uses in key_state_free.
Signed-off-by: Arne Schwabe <arne@rfc2549.org>
Acked-by: Gert Doering <gert@greenie.muc.de>
Message-Id: <
20201023113431.26691-3-arne@rfc2549.org>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg21215.html
Signed-off-by: Gert Doering <gert@greenie.muc.de>
void
reliable_free(struct reliable *rel)
{
+ if (!rel)
+ {
+ return;
+ }
int i;
for (i = 0; i < rel->size; ++i)
{
struct reliable_entry *e = &rel->array[i];
free_buf(&e->buf);
}
+ free(rel);
}
/* no active buffers? */
void reliable_init(struct reliable *rel, int buf_size, int offset, int array_size, bool hold);
/**
- * Free allocated memory associated with a reliable structure.
+ * Free allocated memory associated with a reliable structure and the pointer
+ * itself.
+ * Does nothing if rel is NULL.
*
* @param rel The reliable structured to clean up.
*/
free_buf(&ks->ack_write_buf);
buffer_list_free(ks->paybuf);
- if (ks->send_reliable)
- {
- reliable_free(ks->send_reliable);
- free(ks->send_reliable);
- }
-
- if (ks->rec_reliable)
- {
- reliable_free(ks->rec_reliable);
- free(ks->rec_reliable);
- }
+ reliable_free(ks->send_reliable);
+ reliable_free(ks->rec_reliable);
- if (ks->rec_ack)
- {
- free(ks->rec_ack);
- }
-
- if (ks->key_src)
- {
- free(ks->key_src);
- }
+ free(ks->rec_ack);
+ free(ks->key_src);
packet_id_free(&ks->crypto_options.packet_id);