You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@apr.apache.org by "William A. Rowe Jr." <wr...@rowe-clan.net> on 2011/11/19 00:11:23 UTC

Re: svn commit: r1183715 - in /apr/apr/branches/1.4.x: ./ CHANGES file_io/os2/dir_make_recurse.c file_io/unix/dir.c file_io/win32/dir.c

On 10/15/2011 4:10 PM, sf@apache.org wrote:
> Author: sf
> Date: Sat Oct 15 21:10:18 2011
> New Revision: 1183715
>
> URL: http://svn.apache.org/viewvc?rev=1183715&view=rev
> Log:
> Backport r1183688:
>
>      Fix race condition that could lead to EEXIST being returned
>
>      PR: 51254
>      Submitted by: William Lee<william lee rainstor com>,
>                    Wim Lewis<wiml omnigroup com>
[...]
> Modified: apr/apr/branches/1.4.x/file_io/win32/dir.c
> URL: http://svn.apache.org/viewvc/apr/apr/branches/1.4.x/file_io/win32/dir.c?rev=1183715&r1=1183714&r2=1183715&view=diff
> ==============================================================================
> --- apr/apr/branches/1.4.x/file_io/win32/dir.c (original)
> +++ apr/apr/branches/1.4.x/file_io/win32/dir.c Sat Oct 15 21:10:18 2011
> @@ -333,9 +333,6 @@ APR_DECLARE(apr_status_t) apr_dir_make_r
>
>       rv = apr_dir_make (path, perm, pool); /* Try to make PATH right out */
>
> -    if (APR_STATUS_IS_EEXIST(rv)) /* It's OK if PATH exists */
> -        return APR_SUCCESS;
> -
>       if (APR_STATUS_IS_ENOENT(rv)) { /* Missing an intermediate dir */
>           char *dir;
>
> @@ -347,6 +344,15 @@ APR_DECLARE(apr_status_t) apr_dir_make_r
>           if (rv == APR_SUCCESS)
>               rv = apr_dir_make (dir, perm, pool);   /* And complete the path */
>       }
> +
> +    /*
> +     * It's OK if PATH exists. Timing issues can lead to the second
> +     * apr_dir_make being called on existing dir, therefore this check
> +     * has to come last.
> +     */
> +    if (APR_STATUS_IS_EEXIST(apr_err))
> +        return APR_SUCCESS;
> +
>       return rv;
>   }
>

Stefan, what is an apr_err?  Inquiring compilers want to know.  Pls fix.