Since we already allowed injecting any Session via runTLS or throwing any Error
via throwE, this does not reduce safety at all but improves ergonomics
considerably.
The only downside here is that we must say goodbye to our transitional MonadIO
instance.
A lot of the utilities are still in IO for now, and we still provide a
transitional MonadIO instance, but the transformer stack itself is Unexceptional now.
When this code was written ExceptT didn't exist yet, but there's no reason to
vendor a custom implementation of it any longer. We're taking very little
advantage of the monads-tf features so just remove that dependency (and the
language extension reliance that goes with it).
This function was deprecated at some point in the distant past, and has
now been removed from gnutls upstream. There is no good replacement, and
no current users of the Haskell wrapper, so the easiest solution is to
remove setPriority from the binding.
GnuTLS has separate initialization and deinitialization procedures for
global and per-session state. Previously, haskell-gnutls used Haskell's
garbage collector (via ForeignPtr) to manage these separate states by
creating a dummy GlobalState type representing an initialized global
state. The Session type contained ForeignPtrs to the global and session
state, with the idea that GC would collect them both at the same time
(albeit in non-determinstic order).
It turns out that session deinitialization *requires* an initialized
global state, and calling gnutls_deinit() after gnutls_global_deinit()
can cause a crash.
This patch solves the crash by removing the GlobalState ForeignPtr hack,
and ensuring that gnutls_global_deinit() is always called after
gnutls_deinit().
Originally reported by Keven McKenzie and Joey Hess.