@@ -151,20 +151,22 @@ func (u Util) WriteLink(s types.Link) error {
151
151
}
152
152
153
153
func (u Util ) SetPermissions (mode * int , node types.Node ) error {
154
- if mode != nil {
155
- if err := os .Chmod (node .Path , ToFileMode (* mode )); err != nil {
156
- return fmt .Errorf ("failed to change mode of %s: %v" , node .Path , err )
157
- }
158
- }
159
-
154
+ // Set ownership and then permissions, https://man7.org/linux/man-pages/man2/lchown.2.html
155
+ // "... When the owner or group of an executable file is changed by an
156
+ // unprivileged user, the S_ISUID and S_ISGID mode bits are cleared..."
160
157
defaultUid , defaultGid , _ := getFileOwnerAndMode (node .Path )
161
158
uid , gid , err := u .ResolveNodeUidAndGid (node , defaultUid , defaultGid )
162
- if err != nil {
163
- return fmt .Errorf ("failed to determine correct uid and gid for %s: %v" , node .Path , err )
164
- }
165
159
if err := os .Lchown (node .Path , uid , gid ); err != nil {
166
160
return fmt .Errorf ("failed to change ownership of %s: %v" , node .Path , err )
167
161
}
162
+ if mode != nil {
163
+ if err != nil {
164
+ return fmt .Errorf ("failed to determine correct uid and gid for %s: %v" , node .Path , err )
165
+ }
166
+ if err := os .Chmod (node .Path , ToFileMode (* mode )); err != nil {
167
+ return fmt .Errorf ("failed to change mode of %s: %v" , node .Path , err )
168
+ }
169
+ }
168
170
return nil
169
171
}
170
172
0 commit comments