On 27.11.2018 19:10, kot...@apache.org wrote:
> Author: kotkov
> Date: Tue Nov 27 18:10:01 2018
> New Revision: 1847572
>
> URL: http://svn.apache.org/viewvc?rev=1847572&view=rev
> Log:
> fsfs: Fix an issue with the DAG open_path() that was causing unexpected
> SVN_ERR_FS_NOT_DIRECTORY errors when attempting to open a path with
> `open_path_node_only | open_path_allow_null` flags.
[...]
> @@ -1016,12 +1035,26 @@ open_path(parent_path_t **parent_path_p,
>SVN_ERR(dag_node_cache_get(&here, root, directory, pool));
>
>/* Did the shortcut work? */
> - if (here)
> + if (here && svn_fs_fs__dag_node_kind(here) == svn_node_dir)
> {
>apr_size_t dirname_len = strlen(directory);
>path_so_far->len = dirname_len;
>rest = path + dirname_len + 1;
> }
> + else if (here)
> +{
> + /* The parent node is not a directory. We are looking for some
> + sub-path, so that sub-path will not exist. That will be
> o.k.
> + if we are just here to check for the path's existence, but
> + should result in an error otherwise. */
> + if (flags & open_path_allow_null)
> +{
> + *parent_path_p = NULL;
> + return SVN_NO_ERROR;
> +}
> + else
> +return err_not_directory(root, directory, pool);
> +}
> }
> }
>
Would be nice to wrap this return value in svn_error_trace(), as that
makes it easier to find where the error came from.
> @@ -1144,8 +1177,6 @@ open_path(parent_path_t **parent_path_p,
>/* The path isn't finished yet; we'd better be in a directory. */
>if (svn_fs_fs__dag_node_kind(child) != svn_node_dir)
> {
> - const char *msg;
> -
>/* Since this is not a directory and we are looking for some
> sub-path, that sub-path will not exist. That will be o.k.,
> if we are just here to check for the path's existence. */
> @@ -1156,14 +1187,7 @@ open_path(parent_path_t **parent_path_p,
> }
>
>/* It's really a problem ... */
> - msg = root->is_txn_root
> - ? apr_psprintf(iterpool,
> - _("Failure opening '%s' in transaction '%s'"),
> - path, root->txn)
> - : apr_psprintf(iterpool,
> - _("Failure opening '%s' in revision %ld"),
> - path, root->rev);
> - SVN_ERR_W(SVN_FS__ERR_NOT_DIRECTORY(fs, path_so_far->data), msg);
> + return err_not_directory(root, path_so_far->data, iterpool);
> }
And here.
-- Brane