aboutsummaryrefslogtreecommitdiff
path: root/session.go
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2026-02-15 13:44:39 +0700
committerShulhan <ms@kilabit.info>2026-02-15 13:45:38 +0700
commit83a162bfa6e6eba78ae439e193682c19b9cd4744 (patch)
tree8588115d422a34aeaefa22e759ef1f19d992784f /session.go
parent19d58e9a4c900aec1d63de45a655657c760b1235 (diff)
downloadawwan-83a162bfa6e6eba78ae439e193682c19b9cd4744.tar.xz
all: fix chmod/chown if destination is directory
Given the following command #put!+0644 src/file dst/ If the dst is a directory, it would cause the directory permission changes to 0644. This changes fix it by checking if the destination is a directory first. If we cannot stat the dst, skip the chmod/chown command.
Diffstat (limited to 'session.go')
-rw-r--r--session.go11
1 files changed, 11 insertions, 0 deletions
diff --git a/session.go b/session.go
index 42fd0a4..2ac1c60 100644
--- a/session.go
+++ b/session.go
@@ -265,6 +265,17 @@ func (ses *Session) SudoCopy(ctx context.Context, req *ExecRequest, stmt *Statem
return fmt.Errorf("%s: %w", logp, err)
}
+ dstFileInfo, err := os.Stat(dst)
+ if err != nil {
+ log.Printf(`%s: stat fails, skip setting file mode and/or owner: %s`,
+ logp, err)
+ return nil
+ }
+ if dstFileInfo.IsDir() {
+ srcBase := filepath.Base(src)
+ dst = filepath.Join(dst, srcBase)
+ }
+
if stmt.mode != 0 {
var (
fsmode = strconv.FormatUint(uint64(stmt.mode), 8)