diff options
author | Andrew Tridgell <tridge@samba.org> | 2004-10-25 05:27:49 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:04:39 -0500 |
commit | 1be85de5884d107f89eaf4221f225c9ec468365e (patch) | |
tree | 27b97c75724f2bb6e37e4ae1a4b44f20b2cc4a86 /source4/ntvfs/posix/pvfs_open.c | |
parent | 3918ae351db67dd77a393b48e59a487e29febbd9 (diff) | |
download | samba-1be85de5884d107f89eaf4221f225c9ec468365e.tar.gz samba-1be85de5884d107f89eaf4221f225c9ec468365e.tar.bz2 samba-1be85de5884d107f89eaf4221f225c9ec468365e.zip |
r3193: improved the initial permissions choice for file create, based upon dos attribute
(This used to be commit f6fb1e3493a2a0734747f769cd1013215d967cde)
Diffstat (limited to 'source4/ntvfs/posix/pvfs_open.c')
-rw-r--r-- | source4/ntvfs/posix/pvfs_open.c | 36 |
1 files changed, 27 insertions, 9 deletions
diff --git a/source4/ntvfs/posix/pvfs_open.c b/source4/ntvfs/posix/pvfs_open.c index b66b3725db..4844521c45 100644 --- a/source4/ntvfs/posix/pvfs_open.c +++ b/source4/ntvfs/posix/pvfs_open.c @@ -150,7 +150,9 @@ static NTSTATUS pvfs_open_directory(struct pvfs_state *pvfs, talloc_set_destructor(f, pvfs_dir_fd_destructor); if (!name->exists) { - if (mkdir(name->full_name, 0755) == -1) { + uint32_t attrib = io->generic.in.file_attr | FILE_ATTRIBUTE_DIRECTORY; + mode_t mode = pvfs_fileperms(pvfs, attrib); + if (mkdir(name->full_name, mode) == -1) { return pvfs_map_errno(pvfs,errno); } status = pvfs_resolve_name(pvfs, req, io->ntcreatex.in.fname, @@ -287,7 +289,17 @@ static NTSTATUS pvfs_create_file(struct pvfs_state *pvfs, access_mask = GENERIC_RIGHTS_FILE_READ | GENERIC_RIGHTS_FILE_WRITE; } - flags = O_RDWR; + switch (access_mask & (SA_RIGHT_FILE_READ_DATA | SA_RIGHT_FILE_WRITE_DATA)) { + case SA_RIGHT_FILE_READ_DATA: + flags = O_RDONLY; + break; + case SA_RIGHT_FILE_WRITE_DATA: + flags = O_WRONLY; + break; + case SA_RIGHT_FILE_WRITE_DATA|SA_RIGHT_FILE_READ_DATA: + flags = O_RDWR; + break; + } f = talloc_p(req, struct pvfs_file); if (f == NULL) { @@ -299,11 +311,7 @@ static NTSTATUS pvfs_create_file(struct pvfs_state *pvfs, return NT_STATUS_TOO_MANY_OPENED_FILES; } - if (io->ntcreatex.in.file_attr & FILE_ATTRIBUTE_READONLY) { - mode = 0444; - } else { - mode = 0644; - } + mode = pvfs_fileperms(pvfs, io->ntcreatex.in.file_attr); /* create the file */ fd = open(name->full_name, flags | O_CREAT | O_EXCL, mode); @@ -434,7 +442,7 @@ NTSTATUS pvfs_open(struct ntvfs_module_context *ntvfs, access_mask = io->generic.in.access_mask; if (access_mask & SEC_RIGHT_MAXIMUM_ALLOWED) { - if (name->dos.attrib & FILE_ATTRIBUTE_READONLY) { + if (name->exists && (name->dos.attrib & FILE_ATTRIBUTE_READONLY)) { access_mask = GENERIC_RIGHTS_FILE_READ; } else { access_mask = GENERIC_RIGHTS_FILE_READ | GENERIC_RIGHTS_FILE_WRITE; @@ -488,7 +496,17 @@ NTSTATUS pvfs_open(struct ntvfs_module_context *ntvfs, return NT_STATUS_INVALID_PARAMETER; } - flags |= O_RDWR; + switch (access_mask & (SA_RIGHT_FILE_READ_DATA | SA_RIGHT_FILE_WRITE_DATA)) { + case SA_RIGHT_FILE_READ_DATA: + flags |= O_RDONLY; + break; + case SA_RIGHT_FILE_WRITE_DATA: + flags |= O_WRONLY; + break; + case SA_RIGHT_FILE_WRITE_DATA|SA_RIGHT_FILE_READ_DATA: + flags |= O_RDWR; + break; + } /* handle creating a new file separately */ if (!name->exists) { |