void tlsio_bearssl_destroy()

in adapters/tlsio_bearssl.c [965:1073]


void tlsio_bearssl_destroy(CONCRETE_IO_HANDLE tls_io)
{
    size_t i;
	LIST_ITEM_HANDLE first_pending_io;

	if (tls_io == NULL)
	{
		LogError("NULL handle");
	}
	else
    {
        TLS_IO_INSTANCE *tls_io_instance = (TLS_IO_INSTANCE *)tls_io;

        if (tls_io_instance->socket_io_read_bytes != NULL)
        {
            free(tls_io_instance->socket_io_read_bytes);
            tls_io_instance->socket_io_read_bytes = NULL;
        }

        xio_destroy(tls_io_instance->socket_io);

        first_pending_io = singlylinkedlist_get_head_item(tls_io_instance->pending_toencrypt_list);

        while (first_pending_io != NULL)
        {
            PENDING_TLS_IO *pending_tls_io = (PENDING_TLS_IO *)singlylinkedlist_item_get_value(first_pending_io);
            if (pending_tls_io != NULL)
            {
                free(pending_tls_io->bytes);
                free(pending_tls_io);
            }

            (void)singlylinkedlist_remove(tls_io_instance->pending_toencrypt_list, first_pending_io);
            first_pending_io = singlylinkedlist_get_head_item(tls_io_instance->pending_toencrypt_list);
        }

        singlylinkedlist_destroy(tls_io_instance->pending_toencrypt_list);
        tls_io_instance->pending_toencrypt_list = NULL;

        first_pending_io = singlylinkedlist_get_head_item(tls_io_instance->pending_todecrypt_list);

        while (first_pending_io != NULL)
        {
            PENDING_TLS_IO *pending_tls_io = (PENDING_TLS_IO *)singlylinkedlist_item_get_value(first_pending_io);
            if (pending_tls_io != NULL)
            {
                free(pending_tls_io->bytes);
                free(pending_tls_io);
            }

            (void)singlylinkedlist_remove(tls_io_instance->pending_todecrypt_list, first_pending_io);
            first_pending_io = singlylinkedlist_get_head_item(tls_io_instance->pending_todecrypt_list);
        }

        singlylinkedlist_destroy(tls_io_instance->pending_todecrypt_list);
        tls_io_instance->pending_todecrypt_list = NULL;

        if (tls_io_instance->hostname != NULL)
        {
            free(tls_io_instance->hostname);
            tls_io_instance->hostname = NULL;
        }
        if (tls_io_instance->trusted_certificates != NULL)
        {
            free(tls_io_instance->trusted_certificates);
            tls_io_instance->trusted_certificates = NULL;

            if (tls_io_instance->tas != NULL)
            {
                // Free the memory if it has been previously allocated
                for (i = 0; i < tls_io_instance->ta_count; i++)
                {
		            free_ta_contents(&(tls_io_instance->tas[i]));
                }

                free(tls_io_instance->tas);
                tls_io_instance->tas = NULL;
                tls_io_instance->ta_count = 0;
            }

        }
        if (tls_io_instance->x509_certificate != NULL)
        {
            free(tls_io_instance->x509_certificate);
            tls_io_instance->x509_certificate = NULL;

            if (tls_io_instance->x509_cert != NULL)
            {
                free_certificates(tls_io_instance->x509_cert, tls_io_instance->x509_cert_len);
                free(tls_io_instance->x509_cert);
                tls_io_instance->x509_cert = NULL;
            }
        }
        if (tls_io_instance->x509_private_key != NULL)
        {
            free(tls_io_instance->x509_private_key);
            tls_io_instance->x509_private_key = NULL;

            if (tls_io_instance->x509_pk != NULL)
            {
                free_private_key(tls_io_instance->x509_pk);
                free(tls_io_instance->x509_pk);
                tls_io_instance->x509_pk = NULL;
            }
        }

        free(tls_io);
    }
}