@@ -326,12 +326,17 @@ reliable_init(struct reliable *rel, int buf_size, int offset, int array_size, bo
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? */
@@ -192,7 +192,9 @@ bool reliable_ack_write(struct reliable_ack *ack,
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.
*/
@@ -969,27 +969,11 @@ key_state_free(struct key_state *ks, bool clear)
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);
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> --- src/openvpn/reliable.c | 5 +++++ src/openvpn/reliable.h | 4 +++- src/openvpn/ssl.c | 24 ++++-------------------- 3 files changed, 12 insertions(+), 21 deletions(-)