From bc844105b2ad22cd24af4dc19406b423150cb856 Mon Sep 17 00:00:00 2001 From: Nicola Murino Date: Wed, 27 Nov 2019 22:33:17 +0100 Subject: [PATCH] ssh system commands: wait on write from command out to network we only need to wait for the write from the local command to the ssh channel. There is no need to wait for the write from ssh channel to the local command stdin --- sftpd/sftpd.go | 2 +- sftpd/ssh_cmd.go | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/sftpd/sftpd.go b/sftpd/sftpd.go index c562d03d..5a744997 100644 --- a/sftpd/sftpd.go +++ b/sftpd/sftpd.go @@ -424,7 +424,7 @@ func executeAction(operation, username, path, target, sshCmd string) error { if _, err = os.Stat(actions.Command); err == nil { command := exec.Command(actions.Command, operation, username, path, target, sshCmd) err = command.Start() - logger.Debug(logSender, "", "start command %#v with arguments: %v, %v, %v, %v %v, error: %v", + logger.Debug(logSender, "", "start command %#v with arguments: %#v, %#v, %#v, %#v, %#v, error: %v", actions.Command, operation, username, path, target, sshCmd, err) if err == nil { // we are in a goroutine but we don't want to block here, this way we can send the diff --git a/sftpd/ssh_cmd.go b/sftpd/ssh_cmd.go index fc373555..a51a9eec 100644 --- a/sftpd/ssh_cmd.go +++ b/sftpd/ssh_cmd.go @@ -174,8 +174,7 @@ func (c *sshCommand) executeSystemCommand(command systemCommand) error { c.connection.channel.Close() } var once sync.Once - var wg sync.WaitGroup - wg.Add(2) + commandResponse := make(chan bool) go func() { defer stdin.Close() @@ -207,7 +206,6 @@ func (c *sshCommand) executeSystemCommand(command systemCommand) error { if e != nil { once.Do(closeCmdOnError) } - wg.Done() }() go func() { @@ -235,7 +233,7 @@ func (c *sshCommand) executeSystemCommand(command systemCommand) error { if e != nil { once.Do(closeCmdOnError) } - wg.Done() + commandResponse <- true }() go func() { @@ -265,7 +263,7 @@ func (c *sshCommand) executeSystemCommand(command systemCommand) error { } }() - wg.Wait() + <-commandResponse err = command.cmd.Wait() c.sendExitStatus(err) c.rescanHomeDir() @@ -290,7 +288,7 @@ func (c *sshCommand) getSystemCommand() (systemCommand, error) { args = args[:len(args)-1] args = append(args, path) } - c.connection.Log(logger.LevelDebug, logSenderSSH, "new system command: %v, with args: %v path: %v", c.command, args, path) + c.connection.Log(logger.LevelDebug, logSenderSSH, "new system command %#v, with args: %v path: %v", c.command, args, path) cmd := exec.Command(c.command, args...) uid := c.connection.User.GetUID() gid := c.connection.User.GetGID()