Valgrind finds out that conninfo->servername is not free()d by tls_conninfo_free().
== HEAP SUMMARY: == in use at exit: 83,069 bytes in 2,690 blocks == total heap usage: 4,107 allocs, 1,417 frees, == 339,660 bytes allocated == == 17 bytes in 1 blocks are definitely lost in loss record 1 of 266 == at 0x4C28C20: malloc (vg_replace_malloc.c:296) == by 0x58F5989: strdup (strdup.c:42) == by 0x40B2C4: tls_conninfo_populate == by 0x408C4F: tls_handshake == by 0x403691: TlsContext::handshake() == by 0x403343: TlsStream::connect(TlsConfig*, char const*, == by 0x407781: main (in /home/schen/recipes/ssl/client) == == LEAK SUMMARY: == definitely lost: 17 bytes in 1 blocks == indirectly lost: 0 bytes in 0 blocks == possibly lost: 0 bytes in 0 blocks == still reachable: 83,052 bytes in 2,689 blocks == suppressed: 0 bytes in 0 blocks Here's a quick fix. Regards, Shuo Chen ==================================================== diff --git a/tls/tls_conninfo.c b/tls/tls_conninfo.c --- a/tls/tls_conninfo.c +++ b/tls/tls_conninfo.c @@ -248,6 +248,8 @@ tls_conninfo_free(struct tls_conninfo *conninfo) conninfo->alpn = NULL; free(conninfo->cipher); conninfo->cipher = NULL; + free(conninfo->servername); + conninfo->servername = NULL; free(conninfo->version); conninfo->version = NULL;