diff --git a/multiplex.go b/multiplex.go index 743e144..f56d615 100644 --- a/multiplex.go +++ b/multiplex.go @@ -143,18 +143,22 @@ func (mp *Multiplex) sendMsg(header uint64, data []byte, dl time.Time) error { n += binary.PutUvarint(buf[n:], uint64(len(data))) n += copy(buf[n:], data) - _, err := mp.con.Write(buf[:n]) - if err != nil { + written, err := mp.con.Write(buf[:n]) + if err != nil && written > 0 { + // Bail. We've written partial message and can't do anything + // about this. + mp.con.Close() return err } if !dl.IsZero() { - if err := mp.con.SetWriteDeadline(time.Time{}); err != nil { - return err + // only return this error if we don't *already* have an error from the write. + if err2 := mp.con.SetWriteDeadline(time.Time{}); err == nil && err2 != nil { + return err2 } } - return nil + return err } func (mp *Multiplex) nextChanID() uint64 {