summaryrefslogtreecommitdiff
path: root/source3/smbd/open.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2009-05-30 13:28:03 -0700
committerJeremy Allison <jra@samba.org>2009-05-30 13:28:03 -0700
commitff736dfcadbac8dd7e220eb1f10aa2dfeb1cf7e7 (patch)
tree2886d66147302e241fbd6feedb2d0a75e8a54205 /source3/smbd/open.c
parent68e3442922ff222a5753533561352dd3a11ac0d2 (diff)
downloadsamba-ff736dfcadbac8dd7e220eb1f10aa2dfeb1cf7e7.tar.gz
samba-ff736dfcadbac8dd7e220eb1f10aa2dfeb1cf7e7.tar.bz2
samba-ff736dfcadbac8dd7e220eb1f10aa2dfeb1cf7e7.zip
Fix bug #6421 - POSIX read-only open fails on read-only shares.
The change to smbd/trans2.c opens up SETFILEINFO calls to POSIX_OPEN only. The change to first smbd/open.c closes 2 holes that would have been exposed by allowing POSIX_OPENS on readonly shares, and their ability to set arbitrary flags permutations. The O_CREAT -> O_CREAT|O_EXCL change removes an illegal combination (O_EXCL without O_CREAT) that previously was being passed down to the open syscall. Jeremy.
Diffstat (limited to 'source3/smbd/open.c')
-rw-r--r--source3/smbd/open.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index c1b29f68f3..fdfa99953f 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -346,7 +346,7 @@ static NTSTATUS open_file(files_struct *fsp,
if (!CAN_WRITE(conn)) {
/* It's a read-only share - fail if we wanted to write. */
- if(accmode != O_RDONLY) {
+ if(accmode != O_RDONLY || (flags & O_TRUNC) || (flags & O_APPEND)) {
DEBUG(3,("Permission denied opening %s\n", path));
return NT_STATUS_ACCESS_DENIED;
} else if(flags & O_CREAT) {
@@ -354,8 +354,8 @@ static NTSTATUS open_file(files_struct *fsp,
O_CREAT doesn't create the file if we have write
access into the directory.
*/
- flags &= ~O_CREAT;
- local_flags &= ~O_CREAT;
+ flags &= ~(O_CREAT|O_EXCL);
+ local_flags &= ~(O_CREAT|O_EXCL);
}
}