On 10/10/06, William A. Rowe, Jr. <[EMAIL PROTECTED]> wrote:
Thanks Branko - and Mladen - I'm studying the code, Mladen's interpretation
for threadpriv.c and compilation on vc 6.0, 2002, 2003 and 2005 flavor VS's
to determine if this is the best solution, and should be ready to comment
more tomorrow.

I'm especially interested in the emits Mladen later reported which I'll work
on diagnosing and explaining.  It might take a bit of reverse engineering.

I don't really know the root cause, but this whole set of changes
borks Subversion when it tries to terminate with VS 2005.

As best as I can determine, the calling sequence is:

1) svn.exe's main() function exits normally
2) apr_terminate() gets invoked
3) threadkey_terminate() is called
4) APR's DllMain() is called with DLL_THREAD_DETACH
5) threadkey_detach() is called
6) apr_hash_first() is called with an invalid pointer

threadkey_detach() segfaults because it tries to access memory that
was freed in apr_terminate().

I've managed to resolve this locally by the patch below.  Does this
make sense?  -- justin

Index: misc/win32/start.c
===================================================================
--- misc/win32/start.c  (revision 464264)
+++ misc/win32/start.c  (working copy)
@@ -253,7 +253,9 @@
        case DLL_THREAD_ATTACH:
        break;
        case DLL_THREAD_DETACH:
-            threadkey_detach();
+            if (initialized) {
+                threadkey_detach();
+            }
        break;
        case DLL_PROCESS_DETACH:
        break;

Reply via email to