Hello!

I've found a potential bug in 
svn_wc__db_wcroot_parse_local_abspath
function.

Suppose the following directories structure:

working_copy_root
    |
   +----nested_working_copy_root
   +----not_versioned_symlink

Suppose also that not_versioned_symlink points to "nested_working_copy_root".

I want to find the working copy root to which "not_versioned_symlink" belongs, 
so I call 
"svn_wc__db_wcroot_parse_local_abspath" with a path to "not_versioned_symlink".

There're 2 options.
1. if the cache (db->dir_data in this function) is empty the function will 
check the symlink's 
parent (i.e. "working_copy_root") and will call "svn_wc__db_read_info_internal" 
on it, 
so that "retry_if_dir" variable will be set to TRUE,
and "not_versioned_symlink" will be eventually found as working copy root 
(because it points to a 
working copy root).

2. But if the cache already contains a record about "working_copy_root", the 
function will check the 
symlink's parent (i.e. "working_copy_root"), discover it in the cache, and 
hence return 
"working_copy_root" as a resulting root.

So the function depends on the cache contents.
The only reason why "svn add" find the correct (in the context of addition) 
root (i.e. 
"working_copy_root") is that a record about "working_copy_root" gets into the 
cache while obtaining 
a lock on "working_copy_root", so it's just a luck. And btw "svn info 
not_versioned_symlink" thinks 
that "not_versioned_symlink" itself is a working copy, not "working_copy_root".

The question is what's the expected working copy root should this function 
return on this example?

To my opinion, it should return "not_versioned_symlink" without regarding the 
cache contents, 
because the most of the commands (except "svn add") expect this behaviour. For 
"svn add" there 
should be another code that processes symlink case separatedly.

Unfortunately I can't provide a reproducing code now, but I hope the 
algorithm's authors will easily 
understand what I am writing about.

Reply via email to