Folder can be renamed with an open file inside the same folder from different client
Jeremy Allison
jra at samba.org
Wed Oct 2 10:02:57 MDT 2013
On Tue, Oct 01, 2013 at 04:46:31PM +0530, Shilpa K wrote:
> Hello,
>
> Renaming a folder succeeds in the following scenario when it should
> actually fail:
>
> 1. Client 1 has opened the file temp.doc which is present in the
> directory TESTDIR
>
> 2. Client 2 tries to rename the directory TESTDIR to DIR1 and it
> succeeds.
>
> On the other hand, if the windows client tries to rename a directory from
> client 2 wherein client 1 has opened a file under that directory, the
> operation results in access denied. Samba also sends access denied error
> when we try to rename the directory from the same client where the file is
> opened under it. In this case, the following code takes care of returning
> the appropriate error:
>
> /* If no pathnames are open below this
>
> directory, allow the rename. */
>
> if (file_find_subpath(fsp)) {
>
> return NT_STATUS_ACCESS_DENIED;
>
> }
>
> file_find_subpath() goes through the connection list for that particular
> client and if a directory has file open under it, it returns access denied.
> The reason this code is not working in case of multiple clients is because
> the connection list is specific to a particular SMBD process and not
> visible to other SMBD processes. As for as I understand, the only way the
> other SMBD processes can know if the file in a directory is open is through
> locking.tdb. But traversing locking.tdb to find an open file under a
> particular directory can be a tedious operation. Is there a simpler way by
> which we can find out if the file is open under a directory when we try to
> rename it?
Yeah, this is something we've known about for a while.
It's not easy to fix given our current architecture.
Also look at the code inside unix_convert() inside
source3/smbd/filename.c for the comment around
the #if defined(DEVELOPER) section.
Jeremy.
More information about the samba-technical
mailing list