The branch, v3-6-test has been updated
       via  9994cca Part 5 of bugfix for #8211 - "inherit owner = yes" doesn't 
interact correctly with "inherit permissions = yes" and POSIX ACLs
       via  10489d9 Part 4 of bugfix for #8211 - "inherit owner = yes" doesn't 
interact correctly with "inherit permissions = yes" and POSIX ACLs
       via  1e0c743 Part 3 of bugfix for #8211 - "inherit owner = yes" doesn't 
interact correctly with "inherit permissions = yes" and POSIX ACLs
       via  282b096 Part 2 of bugfix for #8211 - "inherit owner = yes" doesn't 
interact correctly with "inherit permissions = yes" and POSIX ACLs
      from  64bba3b VERSION: Bump version up to 3.6.0.

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-6-test


- Log -----------------------------------------------------------------
commit 9994cca22b2c4948c7948f4d83dc3e8efbbd121e
Author: Jeremy Allison <[email protected]>
Date:   Wed Jun 8 14:38:09 2011 -0700

    Part 5 of bugfix for #8211 - "inherit owner = yes" doesn't interact 
correctly with "inherit permissions = yes" and POSIX ACLs
    
    Ensure when creating a directory, if we make any changes due to inheritance 
parameters, we update the stat returned.

commit 10489d903a4a6c7566787808b4e00ee0fcee7d70
Author: Jeremy Allison <[email protected]>
Date:   Wed Jun 8 14:26:30 2011 -0700

    Part 4 of bugfix for #8211 - "inherit owner = yes" doesn't interact 
correctly with "inherit permissions = yes" and POSIX ACLs
    
    We don't need to check mode bits as well as dev/ino to
    ensure we're in the same place.

commit 1e0c7438074bf0e76d34ea5aac70d5f55d2b364a
Author: Jeremy Allison <[email protected]>
Date:   Tue Jun 7 16:55:20 2011 -0700

    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.
    
    Autobuild-User: Jeremy Allison <[email protected]>
    Autobuild-Date: Wed Jun  8 03:07:04 CEST 2011 on sn-devel-104
    (cherry picked from commit 5fb27814ad5566b264acf0f014d1721afc39b176)

commit 282b09692d23253dd6c3808e1a96de84073ba4e2
Author: Jeremy Allison <[email protected]>
Date:   Wed Jun 8 12:54:33 2011 -0700

    Part 2 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
    also change the returned stat struct to have the correct uid.

-----------------------------------------------------------------------

Summary of changes:
 source3/smbd/open.c |   85 +++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 62 insertions(+), 23 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index aea25fe..9b94e65 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -237,11 +237,13 @@ void change_file_owner_to_parent(connection_struct *conn,
                         "was %s\n", fsp_str_dbg(fsp),
                         (unsigned int)smb_fname_parent->st.st_ex_uid,
                         strerror(errno) ));
-       }
-
-       DEBUG(10,("change_file_owner_to_parent: changed new file %s to "
+       } else {
+               DEBUG(10,("change_file_owner_to_parent: changed new file %s to "
                  "parent directory uid %u.\n", fsp_str_dbg(fsp),
                  (unsigned int)smb_fname_parent->st.st_ex_uid));
+               /* Ensure the uid entry is updated. */
+               fsp->fsp_name->st.st_ex_uid = smb_fname_parent->st.st_ex_uid;
+       }
 
        TALLOC_FREE(smb_fname_parent);
 }
@@ -316,10 +318,9 @@ NTSTATUS change_dir_owner_to_parent(connection_struct 
*conn,
 
        /* Ensure we're pointing at the same place. */
        if (smb_fname_cwd->st.st_ex_dev != psbuf->st_ex_dev ||
-           smb_fname_cwd->st.st_ex_ino != psbuf->st_ex_ino ||
-           smb_fname_cwd->st.st_ex_mode != psbuf->st_ex_mode ) {
+           smb_fname_cwd->st.st_ex_ino != psbuf->st_ex_ino) {
                DEBUG(0,("change_dir_owner_to_parent: "
-                        "device/inode/mode on directory %s changed. "
+                        "device/inode on directory %s changed. "
                         "Refusing to chown !\n", fname ));
                status = NT_STATUS_ACCESS_DENIED;
                goto chdir;
@@ -379,6 +380,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;
@@ -478,23 +480,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 {
@@ -604,6 +590,47 @@ static NTSTATUS open_file(files_struct *fsp,
                        fd_close(fsp);
                        return status;
                }
+
+               if (file_created) {
+                       bool need_re_stat = false;
+                       /* 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);
+                               need_re_stat = true;
+                       }
+
+                       /* Change the owner if required. */
+                       if (lp_inherit_owner(SNUM(conn))) {
+                               change_file_owner_to_parent(conn, parent_dir,
+                                                           fsp);
+                               need_re_stat = true;
+                       }
+
+                       if (need_re_stat) {
+                               if (fsp->fh->fd == -1) {
+                                       ret = SMB_VFS_STAT(conn, smb_fname);
+                               } else {
+                                       ret = SMB_VFS_FSTAT(fsp, 
&smb_fname->st);
+                                       /* If we have an fd, this stat should 
succeed. */
+                                       if (ret == -1) {
+                                               DEBUG(0,("Error doing fstat on 
open file %s "
+                                                        "(%s)\n",
+                                                        
smb_fname_str_dbg(smb_fname),
+                                                        strerror(errno) ));
+                                       }
+                               }
+                       }
+
+                       notify_fname(conn, NOTIFY_ACTION_ADDED,
+                                    FILE_NOTIFY_CHANGE_FILE_NAME,
+                                    smb_fname->base_name);
+               }
        }
 
        /*
@@ -2543,6 +2570,7 @@ static NTSTATUS mkdir_internal(connection_struct *conn,
        char *parent_dir;
        NTSTATUS status;
        bool posix_open = false;
+       bool need_re_stat = false;
 
        if(!CAN_WRITE(conn)) {
                DEBUG(5,("mkdir_internal: failing create on read-only share "
@@ -2597,6 +2625,7 @@ static NTSTATUS mkdir_internal(connection_struct *conn,
        if (lp_inherit_perms(SNUM(conn))) {
                inherit_access_posix_acl(conn, parent_dir,
                                         smb_dname->base_name, mode);
+               need_re_stat = true;
        }
 
        if (!posix_open) {
@@ -2611,6 +2640,7 @@ static NTSTATUS mkdir_internal(connection_struct *conn,
                        SMB_VFS_CHMOD(conn, smb_dname->base_name,
                                      (smb_dname->st.st_ex_mode |
                                          (mode & ~smb_dname->st.st_ex_mode)));
+                       need_re_stat = true;
                }
        }
 
@@ -2619,6 +2649,15 @@ static NTSTATUS mkdir_internal(connection_struct *conn,
                change_dir_owner_to_parent(conn, parent_dir,
                                           smb_dname->base_name,
                                           &smb_dname->st);
+               need_re_stat = true;
+       }
+
+       if (need_re_stat) {
+               if (SMB_VFS_LSTAT(conn, smb_dname) == -1) {
+                       DEBUG(2, ("Could not stat directory '%s' just created: 
%s\n",
+                         smb_fname_str_dbg(smb_dname), strerror(errno)));
+                       return map_nt_error_from_unix(errno);
+               }
        }
 
        notify_fname(conn, NOTIFY_ACTION_ADDED, FILE_NOTIFY_CHANGE_DIR_NAME,


-- 
Samba Shared Repository

Reply via email to