On Wed, Dec 26, 2001 at 04:54:00AM -0800, Brian Pane wrote:
> I'm seeing a segfault during child process shutdown with the
> worker MPM on Solaris.  It appears to happen because the worker
> threads do this:
> 
> static void *worker_thread(apr_thread_t *thd, void * dummy)
> {
>    proc_info * ti = dummy;
>    int process_slot = ti->pid;
>    int thread_slot = ti->tid;
>    apr_socket_t *csd = NULL;
>    apr_pool_t *ptrans;                /* Pool for per-transaction stuff */
>    apr_status_t rv;
> ...
>    rv = APR_SUCCESS;
>    apr_thread_exit(thd, &rv);
>    return NULL;
> }
> 
> Note that "rv" is a local var...
> When apr_thread_join tries to dereference the saved apr_status_t*
> to get the return status, it's accessing memory on the stack of
> a now-defunct thread.  This yields random data at best, or a segfault
> at worst.
> 
> I was about to apply the simple fix: make the worker thread malloc
> an apr_status_t and pass the address of the malloc'ed block to
> apr_thread_exit.  But that won't quite work, because apr_thread_join
> makes a copy of the return status, rather than passing the pointer
> itself back to the thread that does the join.  So there would be
> no way to free the malloc'ed space.
> 
> I think the only clean way to fix this is to change apr_thread_exit
> and apr_thread_join.
> Either:
>  * malloc space for a copy of the return status in apr_thread_exit
>    and free it in apr_thread join

-0

> or:
>  * add an apr_status_t to the apr_thread_t struct, and store the
>    exit status there

+1, and I have a patch to do this across all platforms that was never
committed. Lemme dig it up and apply it today unless someone else gets
to it first.

-aaron

Reply via email to