From e670b3564c3c12baaab0e988f155a86b9437f66e Mon Sep 17 00:00:00 2001
From: Jeremy Allison <jra@samba.org>
Date: Mon, 26 Mar 2001 19:18:06 +0000
Subject: smbd/posix_acls.c: Saving and restoring errno here is the wrong
 place. Moved it to the places where [f]chmod_acl is called instead. Jeremy.
 (This used to be commit 641ada44ae6429761c1fd0dbcafabc69f897fac7)

---
 source3/smbd/open.c       |  9 ++++++---
 source3/smbd/posix_acls.c | 13 ++-----------
 source3/smbd/vfs-wrap.c   |  8 +++++++-
 3 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index afcaeff1ae..c601121459 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -194,9 +194,12 @@ static BOOL open_file(files_struct *fsp,connection_struct *conn,
 	 * Take care of inherited ACLs on created files. JRA.
 	 */
 
-	if ((flags & O_CREAT) && (conn->vfs_ops.fchmod_acl != NULL))
-		conn->vfs_ops.fchmod_acl(fsp, fsp->fd, mode);
-
+	if ((flags & O_CREAT) && (conn->vfs_ops.fchmod_acl != NULL)) {
+		int saved_errno = errno; /* We might get ENOSYS in the next call.. */
+		if (conn->vfs_ops.fchmod_acl(fsp, fsp->fd, mode) == -1 && errno == ENOSYS)
+			errno = saved_errno; /* Ignore ENOSYS */
+	}
+		
 	return True;
 }
 
diff --git a/source3/smbd/posix_acls.c b/source3/smbd/posix_acls.c
index 325fd3b716..b7ba8e44ef 100644
--- a/source3/smbd/posix_acls.c
+++ b/source3/smbd/posix_acls.c
@@ -1236,7 +1236,6 @@ static int map_acl_perms_to_permset(mode_t mode, SMB_ACL_PERMSET_T *p_permset)
 
 static void arrange_posix_perms( char *filename, canon_ace **pp_list_head)
 {
-	extern DOM_SID global_sid_World;
 	canon_ace *list_head = *pp_list_head;
 	canon_ace *owner_ace = NULL;
 	canon_ace *other_ace = NULL;
@@ -2126,15 +2125,11 @@ static int chmod_acl_internals( SMB_ACL_T posix_acl, mode_t mode)
 
 int chmod_acl(char *name, mode_t mode)
 {
-	int saved_errno = errno;
 	SMB_ACL_T posix_acl = NULL;
 	int ret = -1;
 
-	if ((posix_acl = sys_acl_get_file(name, SMB_ACL_TYPE_ACCESS)) == NULL) {
-		if (errno == ENOSYS)
-			errno = saved_errno;
+	if ((posix_acl = sys_acl_get_file(name, SMB_ACL_TYPE_ACCESS)) == NULL)
 		return -1;
-	}
 
 	if ((ret = chmod_acl_internals(posix_acl, mode)) == -1)
 		goto done;
@@ -2154,15 +2149,11 @@ int chmod_acl(char *name, mode_t mode)
 
 int fchmod_acl(int fd, mode_t mode)
 {
-	int saved_errno = errno;
 	SMB_ACL_T posix_acl = NULL;
 	int ret = -1;
 
-	if ((posix_acl = sys_acl_get_fd(fd)) == NULL) {
-		if (errno == ENOSYS)
-			errno = saved_errno;
+	if ((posix_acl = sys_acl_get_fd(fd)) == NULL)
 		return -1;
-	}
 
 	if ((ret = chmod_acl_internals(posix_acl, mode)) == -1)
 		goto done;
diff --git a/source3/smbd/vfs-wrap.c b/source3/smbd/vfs-wrap.c
index 8750f71151..a4057eb7ce 100644
--- a/source3/smbd/vfs-wrap.c
+++ b/source3/smbd/vfs-wrap.c
@@ -115,8 +115,10 @@ int vfswrap_mkdir(connection_struct *conn, char *path, mode_t mode)
 		 * group permission bits. This is not what we want, as it will
 		 * mess up any inherited ACL bits that were set. JRA.
 		 */
+		int saved_errno = errno; /* We may get ENOSYS */
 		if (conn->vfs_ops.chmod_acl != NULL) {
-			conn->vfs_ops.chmod_acl(conn, path, mode);
+			if ((conn->vfs_ops.chmod_acl(conn, path, mode) == -1) && (errno == ENOSYS))
+				errno = saved_errno;
 		}
 	}
 
@@ -351,11 +353,15 @@ int vfswrap_chmod(connection_struct *conn, char *path, mode_t mode)
 	 * group owner bits directly. JRA.
 	 */
 
+	
 	if (conn->vfs_ops.chmod_acl != NULL) {
+		int saved_errno = errno; /* We might get ENOSYS */
 		if ((result = conn->vfs_ops.chmod_acl(conn, path, mode)) == 0) {
 			END_PROFILE(syscall_chmod);
 			return result;
 		}
+		/* Error - return the old errno. */
+		errno = saved_errno;
 	}
 
     result = chmod(path, mode);
-- 
cgit