On Thu, Mar 27, 2014 at 8:15 AM, Yann Ylavic <ylavic....@gmail.com> wrote:

> Hi,
>
> when using the following code :
>
>     pthread_mutex_t *mymutex;
>     apr_proc_mutex_t *apmutex = NULL;
>     apr_os_proc_mutex_t osmutex = {0};
>     apr_proc_mutex_create(&apmutex, NULL, APR_LOCK_PROC_PTHREAD, p);
>     apr_os_proc_mutex_get(&osmutex, apmutex);
>     mymutex = osmutex.pthread_interproc;
>
> apr_os_proc_mutex_get() derefences the NULL pointer.
>
> The function is implemented like this :
>
> APR_DECLARE(apr_status_t) apr_os_proc_mutex_get(apr_os_proc_mutex_t
> *ospmutex,
>                                                 apr_proc_mutex_t *pmutex)
> {
> #if APR_HAS_SYSVSEM_SERIALIZE || APR_HAS_FCNTL_SERIALIZE ||
> APR_HAS_FLOCK_SERIALIZE || APR_HAS_POSIXSEM_SERIALIZE
>     ospmutex->crossproc = pmutex->interproc->filedes;
> #endif
> #if APR_HAS_PROC_PTHREAD_SERIALIZE
>     ospmutex->pthread_interproc = pmutex->pthread_interproc;
> #endif
>     return APR_SUCCESS;
> }
>
> The problem is that on my linux system, all these APR_HAS_*_SERIALIZE
> are defined to 1, but when a APR_LOCK_PROC_PTHREAD mutex is created,
> apr_proc_mutex_t->pthread_interproc only is initialized, and
> apr_proc_mutex_t->interproc is NULL (hence the segfault).
>
> Maybe the patch above could be applied :
>

trunk r1587063
1.5.x r1587064

Additionally I left this note as a 2.0 showstopper:
http://svn.apache.org/viewvc?view=revision&revision=1587066

Thanks!


> Index: locks/unix/proc_mutex.c
> ===================================================================
> --- locks/unix/proc_mutex.c    (revision 1582271)
> +++ locks/unix/proc_mutex.c    (working copy)
> @@ -1013,7 +1013,12 @@ APR_DECLARE(apr_status_t) apr_os_proc_mutex_get(ap
>                                                  apr_proc_mutex_t *pmutex)
>  {
>  #if APR_HAS_SYSVSEM_SERIALIZE || APR_HAS_FCNTL_SERIALIZE ||
> APR_HAS_FLOCK_SERIALIZE || APR_HAS_POSIXSEM_SERIALIZE
> -    ospmutex->crossproc = pmutex->interproc->filedes;
> +    if (pmutex->interproc) {
> +        ospmutex->crossproc = pmutex->interproc->filedes;
> +    }
> +    else {
> +        ospmutex->crossproc = -1;
> +    }
>  #endif
>  #if APR_HAS_PROC_PTHREAD_SERIALIZE
>      ospmutex->pthread_interproc = pmutex->pthread_interproc;
> [END]
>
> Regards,
> Yann.
>



-- 
Born in Roswell... married an alien...
http://emptyhammock.com/
http://edjective.org/

Reply via email to