@@ -595,7 +595,12 @@ func (c *Conn) compactRawPackets(rawPackets [][]byte) [][]byte {
595595 currentCombinedRawPacket := make ([]byte , 0 )
596596
597597 for _ , rawPacket := range rawPackets {
598- if len (currentCombinedRawPacket ) > 0 && len (currentCombinedRawPacket )+ len (rawPacket ) >= c .maximumTransmissionUnit {
598+ if len (currentCombinedRawPacket ) == 0 && len (rawPacket ) >= c .maximumTransmissionUnit {
599+ combinedRawPackets = append (combinedRawPackets , rawPacket )
600+
601+ continue
602+ } else if len (currentCombinedRawPacket ) > 0 &&
603+ len (currentCombinedRawPacket )+ len (rawPacket ) >= c .maximumTransmissionUnit {
599604 combinedRawPackets = append (combinedRawPackets , currentCombinedRawPacket )
600605 currentCombinedRawPacket = []byte {}
601606 }
@@ -674,7 +679,7 @@ func (c *Conn) processPacket(pkt *packet) ([]byte, error) { //nolint:cyclop
674679
675680//nolint:cyclop
676681func (c * Conn ) processHandshakePacket (pkt * packet , dtlsHandshake * handshake.Handshake ) ([][]byte , error ) {
677- rawPackets := make ( [][]byte , 0 )
682+ var rawPackets [][]byte
678683
679684 handshakeFragments , err := c .fragmentHandshake (dtlsHandshake )
680685 if err != nil {
@@ -710,12 +715,15 @@ func (c *Conn) processHandshakePacket(pkt *packet, dtlsHandshake *handshake.Hand
710715 ConnectionID : c .state .remoteConnectionID ,
711716 SequenceNumber : pkt .record .Header .SequenceNumber ,
712717 }
713- rawPacket , err = cidHeader .Marshal ()
718+
719+ hs := recordlayer .FixedHeaderSize + len (cidHeader .ConnectionID )
720+ rawPacket = make ([]byte , hs + len (rawInner ))
721+ err = cidHeader .MarshalInto (rawPacket )
714722 if err != nil {
715723 return nil , err
716724 }
717725 pkt .record .Header = * cidHeader
718- rawPacket = append (rawPacket , rawInner ... )
726+ copy (rawPacket [ hs :] , rawInner )
719727 } else {
720728 recordlayerHeader := & recordlayer.Header {
721729 Version : pkt .record .Header .Version ,
@@ -725,13 +733,15 @@ func (c *Conn) processHandshakePacket(pkt *packet, dtlsHandshake *handshake.Hand
725733 SequenceNumber : seq ,
726734 }
727735
728- rawPacket , err = recordlayerHeader .Marshal ()
736+ hs := recordlayer .FixedHeaderSize + len (recordlayerHeader .ConnectionID )
737+ rawPacket = make ([]byte , hs + len (handshakeFragment ))
738+ err = recordlayerHeader .MarshalInto (rawPacket )
729739 if err != nil {
730740 return nil , err
731741 }
732742
733743 pkt .record .Header = * recordlayerHeader
734- rawPacket = append (rawPacket , handshakeFragment ... )
744+ copy (rawPacket [ hs :] , handshakeFragment )
735745 }
736746
737747 if pkt .shouldEncrypt {
@@ -754,14 +764,9 @@ func (c *Conn) fragmentHandshake(dtlsHandshake *handshake.Handshake) ([][]byte,
754764 return nil , err
755765 }
756766
757- fragmentedHandshakes := make ( [][]byte , 0 )
767+ var fragmentedHandshakes [][]byte
758768
759769 contentFragments := splitBytes (content , c .maximumTransmissionUnit )
760- if len (contentFragments ) == 0 {
761- contentFragments = [][]byte {
762- {},
763- }
764- }
765770
766771 offset := 0
767772 for _ , contentFragment := range contentFragments {
@@ -777,12 +782,13 @@ func (c *Conn) fragmentHandshake(dtlsHandshake *handshake.Handshake) ([][]byte,
777782
778783 offset += contentFragmentLen
779784
780- fragmentedHandshake , err := headerFragment .Marshal ()
785+ fragmentedHandshake := make ([]byte , handshake .HeaderLength + len (contentFragment ))
786+ err := headerFragment .MarshalInto (fragmentedHandshake )
781787 if err != nil {
782788 return nil , err
783789 }
784790
785- fragmentedHandshake = append (fragmentedHandshake , contentFragment ... )
791+ copy (fragmentedHandshake [ handshake . HeaderLength :] , contentFragment )
786792 fragmentedHandshakes = append (fragmentedHandshakes , fragmentedHandshake )
787793 }
788794
0 commit comments