Alexandre Julliard : server: Don' t use the cached file mode when setting the security descriptor.

Alexandre Julliard julliard at winehq.org
Mon Aug 17 11:24:49 CDT 2009


Module: wine
Branch: master
Commit: da1784bb9ea65e5021dfade5acaab14362f67657
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=da1784bb9ea65e5021dfade5acaab14362f67657

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Aug 17 17:26:51 2009 +0200

server: Don't use the cached file mode when setting the security descriptor.

---

 server/change.c |   16 ++++++----------
 server/file.c   |   16 ++++++----------
 2 files changed, 12 insertions(+), 20 deletions(-)

diff --git a/server/change.c b/server/change.c
index 2b940fe..06d9e37 100644
--- a/server/change.c
+++ b/server/change.c
@@ -342,6 +342,7 @@ static int dir_set_sd( struct object *obj, const struct security_descriptor *sd,
 {
     struct dir *dir = (struct dir *)obj;
     const SID *owner;
+    struct stat st;
     mode_t mode;
     int unix_fd;
 
@@ -349,7 +350,7 @@ static int dir_set_sd( struct object *obj, const struct security_descriptor *sd,
 
     unix_fd = get_dir_unix_fd( dir );
 
-    if (unix_fd == -1) return 1;
+    if (unix_fd == -1 || fstat( unix_fd, &st ) == -1) return 1;
 
     if (set_info & OWNER_SECURITY_INFORMATION)
     {
@@ -372,18 +373,13 @@ static int dir_set_sd( struct object *obj, const struct security_descriptor *sd,
     if (set_info & DACL_SECURITY_INFORMATION)
     {
         /* keep the bits that we don't map to access rights in the ACL */
-        mode = dir->mode & (S_ISUID|S_ISGID|S_ISVTX|S_IRWXG);
+        mode = st.st_mode & (S_ISUID|S_ISGID|S_ISVTX|S_IRWXG);
         mode |= sd_to_mode( sd, owner );
 
-        if (dir->mode != mode)
+        if (st.st_mode != mode && fchmod( unix_fd, mode ) == -1)
         {
-            if (fchmod( unix_fd, mode ) == -1)
-            {
-                file_set_error();
-                return 0;
-            }
-
-            dir->mode = mode;
+            file_set_error();
+            return 0;
         }
     }
     return 1;
diff --git a/server/file.c b/server/file.c
index bbcd6f4..a74de14 100644
--- a/server/file.c
+++ b/server/file.c
@@ -535,6 +535,7 @@ static int file_set_sd( struct object *obj, const struct security_descriptor *sd
 {
     struct file *file = (struct file *)obj;
     const SID *owner;
+    struct stat st;
     mode_t mode;
     int unix_fd;
 
@@ -542,7 +543,7 @@ static int file_set_sd( struct object *obj, const struct security_descriptor *sd
 
     unix_fd = get_file_unix_fd( file );
 
-    if (unix_fd == -1) return 1;
+    if (unix_fd == -1 || fstat( unix_fd, &st ) == -1) return 1;
 
     if (set_info & OWNER_SECURITY_INFORMATION)
     {
@@ -567,18 +568,13 @@ static int file_set_sd( struct object *obj, const struct security_descriptor *sd
     if (set_info & DACL_SECURITY_INFORMATION)
     {
         /* keep the bits that we don't map to access rights in the ACL */
-        mode = file->mode & (S_ISUID|S_ISGID|S_ISVTX|S_IRWXG);
+        mode = st.st_mode & (S_ISUID|S_ISGID|S_ISVTX|S_IRWXG);
         mode |= sd_to_mode( sd, owner );
 
-        if (file->mode != mode)
+        if (st.st_mode != mode && fchmod( unix_fd, mode ) == -1)
         {
-            if (fchmod( unix_fd, mode ) == -1)
-            {
-                file_set_error();
-                return 0;
-            }
-
-            file->mode = mode;
+            file_set_error();
+            return 0;
         }
     }
     return 1;




More information about the wine-cvs mailing list