diff options
author | Andrew Bartlett <abartlet@samba.org> | 2009-08-07 13:08:35 +1000 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2009-08-07 13:08:35 +1000 |
commit | 37b8235afe4036f7defd9465ae431cae9804fa18 (patch) | |
tree | d62fd2f9b73c3c27bae1054b01c4cde7f3649ac1 /source3/smbd | |
parent | 11ff224e13a26e4ff9fbd01dec395262aac0f9f9 (diff) | |
parent | 457191e9f396898b8a511cf860f24986f36fd879 (diff) | |
download | samba-37b8235afe4036f7defd9465ae431cae9804fa18.tar.gz samba-37b8235afe4036f7defd9465ae431cae9804fa18.tar.bz2 samba-37b8235afe4036f7defd9465ae431cae9804fa18.zip |
Merge branch 'master' of ssh://git.samba.org/data/git/samba into master-devel
Diffstat (limited to 'source3/smbd')
-rw-r--r-- | source3/smbd/files.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/source3/smbd/files.c b/source3/smbd/files.c index a170f774fe..146d809738 100644 --- a/source3/smbd/files.c +++ b/source3/smbd/files.c @@ -404,14 +404,15 @@ bool file_find_subpath(files_struct *dir_fsp) { files_struct *fsp; size_t dlen; - char *d_fullname; + char *d_fullname = NULL; + bool ret = false; d_fullname = talloc_asprintf(talloc_tos(), "%s/%s", dir_fsp->conn->connectpath, dir_fsp->fsp_name->base_name); if (!d_fullname) { - return false; + goto out; } dlen = strlen(d_fullname); @@ -429,15 +430,27 @@ bool file_find_subpath(files_struct *dir_fsp) fsp->fsp_name->base_name); if (strnequal(d_fullname, d1_fullname, dlen)) { - TALLOC_FREE(d_fullname); + int d1_len = strlen(d1_fullname); + + /* + * If the open file is a second file handle to the + * same name or is a stream on the original file, then + * don't return true. + */ + if (d1_len == dlen) { + TALLOC_FREE(d1_fullname); + continue; + } + TALLOC_FREE(d1_fullname); - return true; + ret = true; + goto out; } TALLOC_FREE(d1_fullname); } - + out: TALLOC_FREE(d_fullname); - return false; + return ret; } /**************************************************************************** |