diff options
author | Volker Lendecke <vl@samba.org> | 2013-08-19 10:26:00 +0000 |
---|---|---|
committer | Volker Lendecke <vl@samba.org> | 2013-08-26 12:14:26 +0200 |
commit | 76142780fb6d69bdf6e15ea27b0436da3fa49fae (patch) | |
tree | c234f8769084a463d04149a6ab476b697962f6b6 | |
parent | 84b8bddd7d6845f389444e57d2029f2a954dfcd5 (diff) | |
download | samba-76142780fb6d69bdf6e15ea27b0436da3fa49fae.tar.gz samba-76142780fb6d69bdf6e15ea27b0436da3fa49fae.tar.bz2 samba-76142780fb6d69bdf6e15ea27b0436da3fa49fae.zip |
smbd: Simplify dropbox special case in unix_convert
EACCESS needs special treatment: If we want to create a fresh file,
return OBJECT_PATH_NOT_FOUND, so that the client will continue creating
the file. If the client wants us to open a potentially existing file,
we need to correctly return ACCESS_DENIED.
This patch makes this behaviour hopefully a bit clearer than the code
before did.
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Autobuild-User(master): Volker Lendecke <vl@samba.org>
Autobuild-Date(master): Mon Aug 26 12:14:26 CEST 2013 on sn-devel-104
-rw-r--r-- | source3/smbd/filename.c | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c index 4384f5a5c0..68321eebbb 100644 --- a/source3/smbd/filename.c +++ b/source3/smbd/filename.c @@ -718,13 +718,30 @@ NTSTATUS unix_convert(TALLOC_CTX *ctx, /* * ENOENT/EACCESS are the only valid errors - * here. EACCESS needs handling here for - * "dropboxes", i.e. directories where users - * can only put stuff with permission -wx. + * here. */ - if ((errno != 0) && (errno != ENOENT) - && ((ucf_flags & UCF_CREATING_FILE) && - (errno != EACCES))) { + + if (errno == EACCES) { + if (ucf_flags & UCF_CREATING_FILE) { + /* + * This is the dropbox + * behaviour. A dropbox is a + * directory with only -wx + * permissions, so + * get_real_filename fails + * with EACCESS, it needs to + * list the directory. We + * nevertheless want to allow + * users creating a file. + */ + status = NT_STATUS_OBJECT_PATH_NOT_FOUND; + } else { + status = NT_STATUS_ACCESS_DENIED; + } + goto fail; + } + + if ((errno != 0) && (errno != ENOENT)) { /* * ENOTDIR and ELOOP both map to * NT_STATUS_OBJECT_PATH_NOT_FOUND |