From 84bbe948f3beff0fbdc51c9c63e2f674b70b5bbe Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 2 Oct 2004 12:25:02 +0000 Subject: r2786: - match on both long and short name for search posix backend - a final name component of . is illegal (This used to be commit 11c852170b83e5adbdb58407e1c7d3aeb4ab5bb8) --- source4/ntvfs/posix/pvfs_dirlist.c | 11 ++++++++++- source4/ntvfs/posix/pvfs_resolve.c | 10 ++++++++-- source4/ntvfs/posix/pvfs_shortname.c | 12 +++++++++++- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/source4/ntvfs/posix/pvfs_dirlist.c b/source4/ntvfs/posix/pvfs_dirlist.c index 56afb4f33b..79d9a9a3fa 100644 --- a/source4/ntvfs/posix/pvfs_dirlist.c +++ b/source4/ntvfs/posix/pvfs_dirlist.c @@ -98,11 +98,20 @@ NTSTATUS pvfs_list(struct pvfs_state *pvfs, struct pvfs_filename *name, struct p while ((dent = readdir(odir))) { uint_t i = dir->count; const char *dname = dent->d_name; + char *short_name; + + short_name = pvfs_short_name_component(pvfs, dname); /* check it matches the wildcard pattern */ - if (ms_fnmatch(pattern, dname, PROTOCOL_NT1) != 0) { + if (ms_fnmatch(pattern, dname, + pvfs->tcon->smb_conn->negotiate.protocol) != 0 && + ms_fnmatch(pattern, short_name, + pvfs->tcon->smb_conn->negotiate.protocol) != 0) { + talloc_free(short_name); continue; } + + talloc_free(short_name); if (dir->count >= allocated) { allocated = (allocated + 100) * 1.2; diff --git a/source4/ntvfs/posix/pvfs_resolve.c b/source4/ntvfs/posix/pvfs_resolve.c index dfd6744eff..e846b7be77 100644 --- a/source4/ntvfs/posix/pvfs_resolve.c +++ b/source4/ntvfs/posix/pvfs_resolve.c @@ -159,6 +159,7 @@ static NTSTATUS pvfs_unix_path(struct pvfs_state *pvfs, const char *cifs_name, uint_t flags, struct pvfs_filename *name) { char *ret, *p; + size_t len; name->original_name = talloc_strdup(name, cifs_name); name->stream_name = NULL; @@ -183,8 +184,13 @@ static NTSTATUS pvfs_unix_path(struct pvfs_state *pvfs, const char *cifs_name, p = ret + strlen(pvfs->base_directory) + 1; - if (p[strlen(cifs_name)-1] == '\\') { - p[strlen(cifs_name)-1] = 0; + len = strlen(cifs_name); + if (len>0 && p[len-1] == '\\') { + p[len-1] = 0; + len--; + } + if (len>1 && p[len-1] == '.' && p[len-2] == '\\') { + return NT_STATUS_OBJECT_NAME_INVALID; } /* now do an in-place conversion of '\' to '/', checking diff --git a/source4/ntvfs/posix/pvfs_shortname.c b/source4/ntvfs/posix/pvfs_shortname.c index fe6fd8e030..33e601e429 100644 --- a/source4/ntvfs/posix/pvfs_shortname.c +++ b/source4/ntvfs/posix/pvfs_shortname.c @@ -24,6 +24,16 @@ #include "vfs_posix.h" +/* + return the short name for a component of a full name + TODO: this is obviously not very useful in its current form ! +*/ +char *pvfs_short_name_component(struct pvfs_state *pvfs, const char *name) +{ + return talloc_strndup(pvfs, name, 12); +} + + /* return the short name for a given entry in a directory TODO: this is obviously not very useful in its current form ! @@ -31,5 +41,5 @@ char *pvfs_short_name(struct pvfs_state *pvfs, struct pvfs_filename *name) { char *p = strrchr(name->full_name, '/'); - return talloc_strndup(name, p+1, 12); + return pvfs_short_name_component(pvfs, p+1); } -- cgit