summaryrefslogtreecommitdiff
path: root/source3/smbd
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2006-12-01 23:46:07 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:16:18 -0500
commit61ea96ec79fb9807fb234fe7fc9a59458653c6e5 (patch)
tree872da7cde3a0ff558cbe5ad07b81099d488ab3a8 /source3/smbd
parent4eb9dda8a7e7b8a223478edbb86c7d7a6ddfe4ce (diff)
downloadsamba-61ea96ec79fb9807fb234fe7fc9a59458653c6e5.tar.gz
samba-61ea96ec79fb9807fb234fe7fc9a59458653c6e5.tar.bz2
samba-61ea96ec79fb9807fb234fe7fc9a59458653c6e5.zip
r19993: Fix the problem with Linux clients requesting O_WRONLY
on write-only files. Jim please check. Should not affect Windows clients - I ensured all the relevent Samba4 torture tests still pass. Jeremy. (This used to be commit 6df3cac44fb1eafa84f9fc0ce4485242b4cce111)
Diffstat (limited to 'source3/smbd')
-rw-r--r--source3/smbd/open.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index 1899a6fce7..3d5dd849b6 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -1105,7 +1105,6 @@ NTSTATUS open_file_ntcreate(connection_struct *conn,
uint32 open_access_mask = access_mask;
NTSTATUS status;
int ret_flock;
-
if (conn->printer) {
/*
@@ -1300,7 +1299,15 @@ NTSTATUS open_file_ntcreate(connection_struct *conn,
*/
if (access_mask & (FILE_WRITE_DATA | FILE_APPEND_DATA)) {
- flags = O_RDWR;
+ /* DENY_DOS opens are always underlying read-write on the
+ file handle, no matter what the requested access mask
+ says. */
+ if ((create_options & NTCREATEX_OPTIONS_PRIVATE_DENY_DOS) ||
+ access_mask & (FILE_READ_ATTRIBUTES|FILE_READ_DATA|FILE_READ_EA|FILE_EXECUTE)) {
+ flags = O_RDWR;
+ } else {
+ flags = O_WRONLY;
+ }
} else {
flags = O_RDONLY;
}
@@ -1448,11 +1455,13 @@ NTSTATUS open_file_ntcreate(connection_struct *conn,
if (flags & O_RDWR) {
can_access_mask = FILE_READ_DATA|FILE_WRITE_DATA;
+ } else if (flags & O_WRONLY) {
+ can_access_mask = FILE_WRITE_DATA;
} else {
can_access_mask = FILE_READ_DATA;
}
- if (((flags & O_RDWR) && !CAN_WRITE(conn)) ||
+ if (((can_access_mask & FILE_WRITE_DATA) && !CAN_WRITE(conn)) ||
!can_access_file(conn,fname,psbuf,can_access_mask)) {
can_access = False;
}