Den fre 12 dec. 2025 kl 18:58 skrev Nathan Hartman <[email protected] >:
> On Fri, Dec 12, 2025 at 1:27 PM <[email protected]> wrote: > >> Author: dsahlberg >> Date: Fri Dec 12 18:27:04 2025 >> New Revision: 1930473 >> >> Log: >> Restore the behaviour before r1915214. >> >> * subversion/libsvn_subr/io.c >> (svn_io__is_finfo_read_only): As above >> (svn_io__is_finfo_executable): As above >> (svn_io_is_file_executable): As above >> >> Modified: >> subversion/trunk/subversion/libsvn_subr/io.c >> >> Modified: subversion/trunk/subversion/libsvn_subr/io.c >> >> ============================================================================== >> --- subversion/trunk/subversion/libsvn_subr/io.c Fri Dec 12 >> 18:08:09 2025 (r1930472) >> +++ subversion/trunk/subversion/libsvn_subr/io.c Fri Dec 12 >> 18:27:04 2025 (r1930473) >> @@ -2531,14 +2531,27 @@ svn_io__is_finfo_read_only(svn_boolean_t >> apr_pool_t *pool) >> { >> #if defined(APR_HAS_USER) && !defined(WIN32) &&!defined(__OS2__) >> - *read_only = (access(file_info->fname, W_OK) != 0); >> - /* svn_io__is_finfo_read_only can be called with a dangling >> - * symlink. access() will check the permission on the missing >> - * target and return -1 and errno = ENOENT. Check for ENOENT >> - * and pretend the file is writeable, otherwise we will get >> - * spurious Reverted messages on the symlink. >> - */ >> - if (*read_only && errno == ENOENT) *read_only = FALSE; >> + apr_status_t apr_err; >> + apr_uid_t uid; >> + apr_gid_t gid; >> + >> + *read_only = FALSE; >> + >> + apr_err = apr_uid_current(&uid, &gid, pool); >> + >> + if (apr_err) >> + return svn_error_wrap_apr(apr_err, _("Error getting UID of >> process")); >> + >> + /* Check write bit for current user. */ >> + if (apr_uid_compare(uid, file_info->user) == APR_SUCCESS) >> + *read_only = !(file_info->protection & APR_UWRITE); >> + >> + else if (apr_gid_compare(gid, file_info->group) == APR_SUCCESS) >> + *read_only = !(file_info->protection & APR_GWRITE); >> + >> + else >> + *read_only = !(file_info->protection & APR_WWRITE); >> + >> #else /* WIN32 || __OS2__ || !APR_HAS_USER */ >> *read_only = (file_info->protection & APR_FREADONLY); >> #endif >> @@ -2551,7 +2564,33 @@ svn_io__is_finfo_executable(svn_boolean_ >> apr_finfo_t *file_info, >> apr_pool_t *pool) >> { >> - return svn_io_is_file_executable(executable, file_info->fname, pool); >> +#if defined(APR_HAS_USER) && !defined(WIN32) &&!defined(__OS2__) >> + apr_status_t apr_err; >> + apr_uid_t uid; >> + apr_gid_t gid; >> + >> + *executable = FALSE; >> + >> + apr_err = apr_uid_current(&uid, &gid, pool); >> + >> + if (apr_err) >> + return svn_error_wrap_apr(apr_err, _("Error getting UID of >> process")); >> + >> + /* Check executable bit for current user. */ >> + if (apr_uid_compare(uid, file_info->user) == APR_SUCCESS) >> + *executable = (file_info->protection & APR_UEXECUTE); >> + >> + else if (apr_gid_compare(gid, file_info->group) == APR_SUCCESS) >> + *executable = (file_info->protection & APR_GEXECUTE); >> + >> + else >> + *executable = (file_info->protection & APR_WEXECUTE); >> + >> +#else /* WIN32 || __OS2__ || !APR_HAS_USER */ >> + *executable = FALSE; >> +#endif >> + >> + return SVN_NO_ERROR; >> } >> >> svn_error_t * >> @@ -2560,7 +2599,12 @@ svn_io_is_file_executable(svn_boolean_t >> apr_pool_t *pool) >> { >> #if defined(APR_HAS_USER) && !defined(WIN32) &&!defined(__OS2__) >> - *executable = (access(path, X_OK) == 0); >> + apr_finfo_t file_info; >> + >> + SVN_ERR(svn_io_stat(&file_info, path, APR_FINFO_PROT | APR_FINFO_OWNER, >> + pool)); >> + SVN_ERR(svn_io__is_finfo_executable(executable, &file_info, pool)); >> + >> #else /* WIN32 || __OS2__ || !APR_HAS_USER */ >> *executable = FALSE; >> #endif >> >> > Hi, > > May I suggest recording the rationale for this change in the log message? > Yes, I should have linked to the mailing list. Log message edited! Thanks, Daniel > >

