Another inconsistency in the paths handed to stat in the VFS
Jeremy Allison
jra at samba.org
Wed Apr 15 12:00:42 MDT 2015
On Wed, Apr 15, 2015 at 10:58:20AM -0700, Richard Sharpe wrote:
> Hi folks,
>
> Here is the log from a recent test:
>
> my_test_vfs_stat called with .
> my_test_vfs_stat called with .
> my_test_vfs_stat called with .
> my_test_vfs_stat called with /home/shares/share1
> my_test_vfs_stat called with .
> my_test_vfs_stat called with .
> my_test_vfs_stat called with /
> my_test_vfs_stat called with .
> my_test_vfs_stat called with /home/shares/share1
> my_test_vfs_stat called with .
> my_test_vfs_stat called with .
> my_test_vfs_stat called with .
> my_test_vfs_stat called with .
> my_test_vfs_stat called with ./.
> my_test_vfs_stat called with ./..
> my_test_vfs_stat called with ./testdir2
> my_test_vfs_stat called with ./testdir6
> my_test_vfs_stat called with ./testdir13
> my_test_vfs_stat called with ./testdir8
> my_test_vfs_stat called with ./testdir4
> my_test_vfs_stat called with ./testdir11
> my_test_vfs_stat called with ./somefunnydir
> my_test_vfs_stat called with .
> my_test_vfs_stat called with .
> my_test_vfs_stat called with .
> my_test_vfs_stat called with test6
> my_test_vfs_stat called with test6
> my_test_vfs_stat called with test6
> my_test_vfs_stat called with test6
> my_test_vfs_stat called with test6
> my_test_vfs_stat called with test6
> my_test_vfs_stat called with test6
> my_test_vfs_stat called with test6
> my_test_vfs_stat called with test6
> my_test_vfs_stat called with test6/.
> my_test_vfs_stat called with test6/..
> my_test_vfs_stat called with .
> my_test_vfs_stat called with .
> my_test_vfs_stat called with .
> my_test_vfs_stat called with .
> my_test_vfs_stat called with /
>
> Now, there are some problems here that I am working with Jeremy, but
> the inconsistency I wanted to mention is that in some cases
> SMB_VFS_STAT is called with ./ on the front of the path and in other
> cases it is not.
>
> The following patch seems to fix this problem:
>
> diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c
> index 36d95d5..c9c6850 100644
> --- a/source3/smbd/dir.c
> +++ b/source3/smbd/dir.c
> @@ -1135,10 +1135,20 @@ bool smbd_dirptr_get_entry(TALLOC_CTX *ctx,
> return false;
> }
>
> - memcpy(pathreal, dirptr->path, pathlen);
> - pathreal[pathlen] = '/';
> - memcpy(pathreal + slashlen + pathlen, dname,
> - talloc_get_size(dname));
> + /*
> + * We don't want to pass ./xxx to modules below us so don't
> + * add the path if it is just . by itself. Not sure if we
> + * will ever see ./xxx as a dirpath ...
> + */
> + if (dirptr->path && dirptr->path[0] &&
> + dirptr->path[0] == '.' && pathlen == 1) {
We have a standard macro
#ifndef ISDOT
#define ISDOT(path) ( \
*((const char *)(path)) == '.' && \
*(((const char *)(path)) + 1) == '\0' \
)
#endif
for part of the above...
> + memcpy(pathreal, dname, talloc_get_size(dname));
> + } else {
> + memcpy(pathreal, dirptr->path, pathlen);
> + pathreal[pathlen] = '/';
> + memcpy(pathreal + slashlen + pathlen, dname,
> + talloc_get_size(dname));
> + }
>
> /* Create smb_fname with NULL stream_name. */
> ZERO_STRUCT(smb_fname);
>
>
>
> --
> Regards,
> Richard Sharpe
> (何以解憂?唯有杜康。--曹操)
More information about the samba-technical
mailing list