diff --git a/hkexnet/hkexnet.go b/hkexnet/hkexnet.go index 91d8c4e..a085a12 100644 --- a/hkexnet/hkexnet.go +++ b/hkexnet/hkexnet.go @@ -70,10 +70,9 @@ type ( // Conn is a connection wrapping net.Conn with KEX & session state Conn struct { - kex KEXAlg // KEX/KEM proposal (client -> server) - m *sync.Mutex // (internal) - c *net.Conn // which also implements io.Reader, io.Writer, ... - immClose bool + kex KEXAlg // KEX/KEM proposal (client -> server) + m *sync.Mutex // (internal) + c *net.Conn // which also implements io.Reader, io.Writer, ... logCipherText bool // somewhat expensive, for debugging logPlainText bool // INSECURE and somewhat expensive, for debugging @@ -139,10 +138,6 @@ func (hc *Conn) SetStatus(stat CSOType) { log.Println("closeStat:", *hc.closeStat) } -func (hc *Conn) SetImmClose() { - hc.immClose = true -} - // ConnOpts returns the cipher/hmac options value, which is sent to the // peer but is not itself part of the KEx. // @@ -757,13 +752,7 @@ func (hc *Conn) Close() (err error) { log.Printf("** Writing closeStat %d at Close()\n", *hc.closeStat) //(*hc.c).SetWriteDeadline(time.Now().Add(500 * time.Millisecond)) hc.WritePacket(s, CSOExitStatus) - // This avoids a bug where server side may not get its last packet of - // data through to a client for non-interactive commands which exit - // immediately. Avoiding the immediate close lets the client close its - // side first. - if hc.immClose { - err = (*hc.c).Close() - } + err = (*hc.c).Close() logger.LogDebug(fmt.Sprintln("[Conn Closing]")) return } @@ -1059,7 +1048,6 @@ func (hc Conn) Read(b []byte) (n int, err error) { logger.LogDebug(fmt.Sprintln("[truncated payload, cannot determine CSOExitStatus]")) hc.SetStatus(CSETruncCSO) } - hc.SetImmClose() // clients can immediately close their end hc.Close() } else if ctrlStatOp == CSOTunSetup { // server side tunnel setup in response to client diff --git a/hkexshd/hkexshd.go b/hkexshd/hkexshd.go index 05aa355..0a19c24 100755 --- a/hkexshd/hkexshd.go +++ b/hkexshd/hkexshd.go @@ -405,7 +405,9 @@ func runShellAs(who, hname, ttype, cmd string, interactive bool, conn *hkexnet.C // Background jobs still may be running; close the // pty anyway, so the client can return before // wg.Wait() below completes (Issue #18) - _ = ptmx.Close() + if interactive { + _ = ptmx.Close() + } } wg.Wait() // Wait on pty->stdout completion to client }