summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--examples/ssl/pskclient.nim1
-rw-r--r--lib/pure/net.nim8
2 files changed, 8 insertions, 1 deletions
diff --git a/examples/ssl/pskclient.nim b/examples/ssl/pskclient.nim
index 7c93bbb61..c83f27fbc 100644
--- a/examples/ssl/pskclient.nim
+++ b/examples/ssl/pskclient.nim
@@ -13,3 +13,4 @@ proc clientFunc(identityHint: string): tuple[identity: string, psk: string] =
 let context = newContext(cipherList="PSK-AES256-CBC-SHA")
 context.clientGetPskFunc = clientFunc
 context.wrapConnectedSocket(sock, handshakeAsClient)
+context.destroyContext()
diff --git a/lib/pure/net.nim b/lib/pure/net.nim
index 4bdfede42..368ff6e87 100644
--- a/lib/pure/net.nim
+++ b/lib/pure/net.nim
@@ -267,7 +267,6 @@ when defined(ssl):
     newCTX.loadCertificates(certFile, keyFile)
 
     result = SSLContext(newCTX)
-    # this is never freed, but SSLContext can't be freed anyway yet
     let extraInternal = new(SslContextExtraInternal)
     GC_ref(extraInternal)
     result.setExtraData(extraInternalIndex, cast[pointer](extraInternal))
@@ -275,6 +274,13 @@ when defined(ssl):
   proc getExtraInternal(ctx: SSLContext): SslContextExtraInternal =
     return cast[SslContextExtraInternal](ctx.getExtraData(extraInternalIndex))
 
+  proc destroyContext*(ctx: SSLContext) =
+    ## Free memory referenced by SSLContext.
+    let extraInternal = ctx.getExtraInternal()
+    if extraInternal != nil:
+      GC_unref(extraInternal)
+    SSLCTX(ctx).SSL_CTX_free()
+
   proc `pskIdentityHint=`*(ctx: SSLContext, hint: string) =
     ## Sets the identity hint passed to server.
     ##