Skip to content

Commit ab57b8b

Browse files
committed
internal/exec/util/file: correctly set ownership and permissions
fixes: #2042
1 parent c992889 commit ab57b8b

File tree

1 file changed

+11
-9
lines changed

1 file changed

+11
-9
lines changed

internal/exec/util/file.go

+11-9
Original file line numberDiff line numberDiff line change
@@ -151,20 +151,22 @@ func (u Util) WriteLink(s types.Link) error {
151151
}
152152

153153
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..."
160157
defaultUid, defaultGid, _ := getFileOwnerAndMode(node.Path)
161158
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-
}
165159
if err := os.Lchown(node.Path, uid, gid); err != nil {
166160
return fmt.Errorf("failed to change ownership of %s: %v", node.Path, err)
167161
}
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+
}
168170
return nil
169171
}
170172

0 commit comments

Comments
 (0)