I just tried your patch, Jeff.  It still crashes.  I'll try to get a
backtrace right now.

On May 6, 7:53 am, Jeff Hobbs <je...@activestate.com> wrote:
> Of the presented patches, I didn't find one that seemed to actually
> work, so I wrote one based on those presented.  It is attached.  Please
> test it in your environments.  I have tested that it passes the basic
> tls test suite against a threaded Tcl 8.5.7 core build on Linux-x64 (and
> verified that OPENSSL_THREADS was true for this install).
>
> This patch is against tls 1.6 head.
>
> Jeff
>
> On 05/05/2009 3:42 PM, Sep Ng wrote:
>
> > I'll try it.  I didn't give it much thought at first but looking at it
> > again, I think it might prevent the long string of ns_free and other
> > calls to free memory after DH_free.
>
> > On May 6, 3:43 am, Jeff Hobbs <je...@activestate.com> wrote:
> >> Just starting to look at this, but from the nsopenssl.c I saw another
> >> interesting function not used by TLS:
>
> >> if (CRYPTO_set_mem_functions(ns_malloc, ns_realloc, ns_free) == 0) ...
>
> >> We could do the same and point to Tcl_Alloc, Tcl_Realloc and Tcl_Free.
> >> I'm not sure they are necessary, and CRYPTO_set_mem_debug_functions
> >> isn't used, but it might help debug.
>
> --
> AOLserver -http://www.aolserver.com/
>
> To Remove yourself from this list, simply send an email to 
> <lists...@listserv.aol.com> with the
> body of "SIGNOFF AOLSERVER" in the email message. You can leave the Subject: 
> field of your email blank.
>
> [tls-thread.diff3K ]? announce.txt
> ? tls-thread.diff
> ? tls-verify.diff
> Index: Makefile.in
> ===================================================================
> RCS file: /cvsroot/tls/tls/Makefile.in,v
> retrieving revision 1.27
> diff -u -r1.27 Makefile.in
> --- Makefile.in 19 Mar 2008 22:57:03 -0000      1.27
> +++ Makefile.in 5 May 2009 23:52:38 -0000
> @@ -205,7 +205,7 @@
>               file copy [file join $(srcdir) tls.tcl] tls.tcl \
>           } ;\
>           source [file join $(srcdir) tls.tcl]; \
> -         set argv $(TESTFLAGS); \
> +         set argv {$(TESTFLAGS)}; \
>           source [file join $(srcdir) tests all.tcl]" | $(TCLSH)
>
>  shell: binaries libraries
> Index: tls.c
> ===================================================================
> RCS file: /cvsroot/tls/tls/tls.c,v
> retrieving revision 1.30
> diff -u -r1.30 tls.c
> --- tls.c       19 Mar 2008 22:06:13 -0000      1.30
> +++ tls.c       5 May 2009 23:52:38 -0000
> @@ -130,6 +130,46 @@
>  #define sk_SSL_CIPHER_value( sk, index)        (SSL_CIPHER*)sk_value((sk), 
> (index))
>  #endif
>
> +/*
> + * Thread-Safe TLS Code
> + */
> +
> +#ifdef TCL_THREADS
> +#define OPENSSL_THREAD_DEFINES
> +#include <openssl/opensslconf.h>
> +
> +#ifdef OPENSSL_THREADS
> +#include <openssl/crypto.h>
> +
> +/*
> + * Threaded operation requires locking callbacks
> + * Based from /crypto/cryptlib.c of OpenSSL and NSOpenSSL.
> + */
> +
> +static Tcl_Mutex locks[CRYPTO_NUM_LOCKS];
> +
> +static void CryptoThreadLockCallback(int mode, int n,
> +       const char *file, int line);
> +static unsigned long CryptoThreadIdCallback(void);
> +
> +static void
> +CryptoThreadLockCallback(int mode, int n, const char *file, int line)
> +{
> +    if (mode & CRYPTO_LOCK) {
> +       Tcl_MutexLock(&locks[n]);
> +    } else {
> +       Tcl_MutexUnlock(&locks[n]);
> +    }
> +}
> +
> +static unsigned long
> +CryptoThreadIdCallback(void)
> +{
> +    return (unsigned long) Tcl_GetCurrentThread();
> +}
> +#endif /* OPENSSL_THREADS */
> +#endif /* TCL_THREADS */
> +
>
>  /*
>   *-------------------------------------------------------------------
> @@ -1468,6 +1508,9 @@
>  {
>      int major, minor, patchlevel, release, i;
>      char rnd_seed[16] = "GrzSlplKqUdnnzP!";  /* 16 bytes */
> +#if defined(OPENSSL_THREADS) && defined(TCL_THREADS)
> +    size_t num_locks;
> +#endif
>
>      /*
>       * The original 8.2.0 stacked channel implementation (and the patch
> @@ -1500,6 +1543,24 @@
>         channelTypeVersion = TLS_CHANNEL_VERSION_1;
>      }
>
> +    if (CRYPTO_set_mem_functions((void *(*)(size_t))Tcl_Alloc,
> +                   (void *(*)(void *, size_t))Tcl_Realloc,
> +                   (void(*)(void *))Tcl_Free) == 0) {
> +       /* Not using Tcl's mem functions ... not critical */
> +    }
> +
> +#if defined(OPENSSL_THREADS) && defined(TCL_THREADS)
> +    /* should we consider allocating mutexes? */
> +    num_locks = CRYPTO_num_locks();
> +    if (num_locks > CRYPTO_NUM_LOCKS) {
> +       Tcl_AppendResult(interp, "crypto num locks size error", NULL);
> +       return TCL_ERROR;
> +    }
> +
> +    CRYPTO_set_locking_callback(CryptoThreadLockCallback);
> +    CRYPTO_set_id_callback(CryptoThreadIdCallback);
> +#endif
> +
>      if (SSL_library_init() != 1) {
>         Tcl_AppendResult(interp, "could not initialize SSL library", NULL);
>         return TCL_ERROR;
>
> --
> AOLserver -http://www.aolserver.com/
>
> To Remove yourself from this list, simply send an email to 
> <lists...@listserv.aol.com> with the
> body of "SIGNOFF AOLSERVER" in the email message. You can leave the Subject: 
> field of your email blank.


--
AOLserver - http://www.aolserver.com/

To Remove yourself from this list, simply send an email to 
<lists...@listserv.aol.com> with the
body of "SIGNOFF AOLSERVER" in the email message. You can leave the Subject: 
field of your email blank.

Reply via email to