Ramkumar Ramachandra wrote on Sat, Jan 08, 2011 at 16:06:01 +0530:
> Hi Daniel,
>
> Daniel Shahaf writes:
> > Ping, this doesn't seem to have been fixed yet?
>
> Thanks for the ping, and sorry about the delay. I think this should
> work -- I'll write a commit message if you think this is okay.
>
> Index: subversion/libsvn_subr/io.c
> ===================================================================
> --- subversion/libsvn_subr/io.c (revision 1056662)
> +++ subversion/libsvn_subr/io.c (working copy)
> @@ -1299,59 +1299,64 @@ reown_file(const char *path,
> return svn_error_return(svn_io_remove_file2(unique_name, FALSE, pool));
> }
>
> -/* Determine what the PERMS for a new file should be by looking at the
> - permissions of a temporary file that we create.
> - Unfortunately, umask() as defined in POSIX provides no thread-safe way
> - to get at the current value of the umask, so what we're doing here is
> - the only way we have to determine which combination of write bits
> - (User/Group/World) should be set by default.
> - Make temporary allocations in SCRATCH_POOL. */
> +/* the default permissions as read from the temp folder */
> +static volatile apr_fileperms_t default_perms = 0;
> +static volatile svn_atomic_t perms_init_state;
> +
> +/* Helper function to set default permissions. Passed to svn_atomic__init_once */
> static svn_error_t *
> -get_default_file_perms(apr_fileperms_t *perms, apr_pool_t *scratch_pool)
> +set_default_perms(void *baton, apr_pool_t *scratch_pool)
> {
> - /* the default permissions as read from the temp folder */
> - static apr_fileperms_t default_perms = 0;
> + apr_fileperms_t *default_perms = (apr_fileperms_t *) baton;
>
> - /* Technically, this "racy": Multiple threads may use enter here and
> - try to figure out the default permisission concurrently. That's fine
> - since they will end up with the same results. Even more technical,
> - apr_fileperms_t is an atomic type on 32+ bit machines.
> - */
> - if (default_perms == 0)
> - {
> - apr_finfo_t finfo;
> - apr_file_t *fd;
> + if (default_perms != 0)
This should dereference default_perms.
> + /* Nothing to do */
> + return SVN_NO_ERROR;
>
> - /* Get the perms for a newly created file to find out what bits
> - should be set.
> + apr_finfo_t finfo;
> + apr_file_t *fd;
>
Declarations after statement. C89 only allows declarations at the top
of a block, please fix.
> +/* Determine what the PERMS for a new file should be by looking at the
> + permissions of a temporary file that we create.
> + Unfortunately, umask() as defined in POSIX provides no thread-safe way
> + to get at the current value of the umask, so what we're doing here is
> + the only way we have to determine which combination of write bits
> + (User/Group/World) should be set by default.
> + Make temporary allocations in SCRATCH_POOL. */
> +static svn_error_t *
> +get_default_file_perms(apr_fileperms_t *perms, apr_pool_t *scratch_pool)
> +{
> + SVN_ERR(svn_atomic__init_once(&perms_init_state, set_default_perms,
> + default_perms, scratch_pool));
> + *perms = default_perms;
> + return SVN_NO_ERROR;
+1, this should fix the "DEFAULT_PERMS were being determined racily"
problem.
> +}
> +
> /* OR together permission bits of the file FD and the default permissions
> of a file as determined by get_default_file_perms(). Do temporary
> allocations in SCRATCH_POOL. */
If you send another patch that indents/dedents a block, could you please
attach a 'svn diff -x-w' version of the patch too? It would make
reviewing easier.
Thanks,
Daniel
Received on 2011-01-08 13:03:39 CET