!(attr->ia_mode & S_ISGID))))
attr->ia_valid |= ATTR_FORCE;
- if ((mode & S_ISUID) &&
+ if ((attr->ia_valid & ATTR_MODE) &&
+ (mode & S_ISUID) &&
!(attr->ia_mode & S_ISUID) &&
!(attr->ia_valid & ATTR_KILL_SUID))
attr->ia_valid |= ATTR_KILL_SUID;
- if (((mode & (S_ISGID|S_IXGRP)) == (S_ISGID|S_IXGRP)) &&
+ if ((attr->ia_valid & ATTR_MODE) &&
+ ((mode & (S_ISGID|S_IXGRP)) == (S_ISGID|S_IXGRP)) &&
!(attr->ia_mode & S_ISGID) &&
!(attr->ia_valid & ATTR_KILL_SGID))
attr->ia_valid |= ATTR_KILL_SGID;
--- /dev/null
+LU-4924 - chmod g+s, touch should not clear sgid bit
+
+ $ mkdir 4924
+ $ cd 4924
+ $ touch f
+ $ chmod u=rwx,g=rwxs f
+ $ ls -l f | awk -- '{ print $1, $3, $4 }'
+ > -rwxrwsr-- root root
+ $ touch f
+ $ ls -l f | awk -- '{ print $1, $3, $4 }'
+ > -rwxrwsr-- root root
+ $ cd ..
+ $ rm -rf 4924