diff options
author | Jeremy Allison <jra@samba.org> | 2011-06-08 10:25:33 -0700 |
---|---|---|
committer | Karolin Seeger <kseeger@samba.org> | 2011-06-14 12:59:09 +0200 |
commit | dc27e37ea8f62af657ef39e2d2ca8e12fcdf93c3 (patch) | |
tree | bd07d39730934e3dcff28237bad4d2acecffb072 | |
parent | 06f653a72d84925c76f21ad1d4d8bc907c138f69 (diff) | |
download | samba-dc27e37ea8f62af657ef39e2d2ca8e12fcdf93c3.tar.gz |
Part 3 of bugfix for #8211 - "inherit owner = yes" doesn't interact correctly with "inherit permissions = yes" and POSIX ACLs
When changing ownership on a new file make sure we
must have a valid stat struct before making the inheritance
calls (as they may look at it), and if we make changes we
must have a valid stat struct after them.
(cherry picked from commit d18d6df840d3a47fa1d7b877e07f804f025811ee)
-rw-r--r-- | source3/smbd/open.c | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/source3/smbd/open.c b/source3/smbd/open.c index aaae9673d1a..e77284b9f93 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -370,6 +370,7 @@ static NTSTATUS open_file(files_struct *fsp, int accmode = (flags & O_ACCMODE); int local_flags = flags; bool file_existed = VALID_STAT(fsp->fsp_name->st); + bool file_created = false; fsp->fh->fd = -1; errno = EPERM; @@ -469,23 +470,7 @@ static NTSTATUS open_file(files_struct *fsp, } if ((local_flags & O_CREAT) && !file_existed) { - - /* Inherit the ACL if required */ - if (lp_inherit_perms(SNUM(conn))) { - inherit_access_posix_acl(conn, parent_dir, - smb_fname->base_name, - unx_mode); - } - - /* Change the owner if required. */ - if (lp_inherit_owner(SNUM(conn))) { - change_file_owner_to_parent(conn, parent_dir, - fsp); - } - - notify_fname(conn, NOTIFY_ACTION_ADDED, - FILE_NOTIFY_CHANGE_FILE_NAME, - smb_fname->base_name); + file_created = true; } } else { @@ -595,6 +580,29 @@ static NTSTATUS open_file(files_struct *fsp, fd_close(fsp); return status; } + + if (file_created) { + /* Do all inheritance work after we've + done a successful stat call and filled + in the stat struct in fsp->fsp_name. */ + + /* Inherit the ACL if required */ + if (lp_inherit_perms(SNUM(conn))) { + inherit_access_posix_acl(conn, parent_dir, + smb_fname->base_name, + unx_mode); + } + + /* Change the owner if required. */ + if (lp_inherit_owner(SNUM(conn))) { + change_file_owner_to_parent(conn, parent_dir, + fsp); + } + + notify_fname(conn, NOTIFY_ACTION_ADDED, + FILE_NOTIFY_CHANGE_FILE_NAME, + smb_fname->base_name); + } } /* |