diff --git a/common/mux/server_test.go b/common/mux/server_test.go index 4158bf46..8649a067 100644 --- a/common/mux/server_test.go +++ b/common/mux/server_test.go @@ -90,7 +90,8 @@ func TestRegressionOutboundLeak(t *testing.T) { } { - b := buf.FromBytes([]byte("hello")) + b := buf.New() + b.Write([]byte("hello")) common.Must(muxClientDownlink.Writer.WriteMultiBuffer(buf.MultiBuffer{b})) } @@ -102,7 +103,8 @@ func TestRegressionOutboundLeak(t *testing.T) { } { - b := buf.FromBytes([]byte("world")) + b := buf.New() + b.Write([]byte("world")) common.Must(websiteUplink.Writer.WriteMultiBuffer(buf.MultiBuffer{b})) } diff --git a/common/mux/writer.go b/common/mux/writer.go index e9c113cb..3a7161b5 100644 --- a/common/mux/writer.go +++ b/common/mux/writer.go @@ -78,9 +78,17 @@ func writeMetaWithFrame(writer buf.Writer, meta FrameMetadata, data buf.MultiBuf if _, err := serial.WriteUint16(frame, uint16(data.Len())); err != nil { return err } - mb2 := make(buf.MultiBuffer, 0, len(data)+1) mb2 = append(mb2, frame) + for _, b := range data { + if frame.Len() + b.Len() < buf.Size { + frame.Write(b.Bytes()) + b.Release() + b = nil + } else { + break; + } + } mb2 = append(mb2, data...) return writer.WriteMultiBuffer(mb2) }