@@ -676,14 +676,6 @@ func (c *Conn) handleIncomingPacket(buf []byte, enqueue bool) (bool, *alert.Aler
676676 var err error
677677 buf , err = c .state .cipherSuite .Decrypt (buf )
678678 if err != nil {
679- if len (c .state .SessionID ) > 0 {
680- // According to the RFC, we need to delete the stored session.
681- // https://datatracker.ietf.org/doc/html/rfc5246#section-7.2
682- if delErr := c .fsm .cfg .sessionStore .Del (c .state .SessionID ); delErr != nil {
683- return false , & alert.Alert {Level : alert .Fatal , Description : alert .InternalError }, delErr
684- }
685- return false , & alert.Alert {Level : alert .Fatal , Description : alert .DecryptError }, err
686- }
687679 c .log .Debugf ("%s: decrypt failed: %s" , srvCliStr (c .state .isClient ), err )
688680 return false , nil , nil
689681 }
@@ -764,6 +756,16 @@ func (c *Conn) recvHandshake() <-chan chan struct{} {
764756}
765757
766758func (c * Conn ) notify (ctx context.Context , level alert.Level , desc alert.Description ) error {
759+ if level == alert .Fatal && len (c .state .SessionID ) > 0 {
760+ // According to the RFC, we need to delete the stored session.
761+ // https://datatracker.ietf.org/doc/html/rfc5246#section-7.2
762+ if ss := c .fsm .cfg .sessionStore ; ss != nil {
763+ c .log .Tracef ("clean invalid session: %s" , c .state .SessionID )
764+ if err := ss .Del (c .sessionKey ()); err != nil {
765+ return err
766+ }
767+ }
768+ }
767769 return c .writePackets (ctx , []* packet {
768770 {
769771 record : & recordlayer.RecordLayer {
@@ -960,6 +962,16 @@ func (c *Conn) RemoteAddr() net.Addr {
960962 return c .nextConn .RemoteAddr ()
961963}
962964
965+ func (c * Conn ) sessionKey () []byte {
966+ if c .state .isClient {
967+ // As ServerName can be like 0.example.com, it's better to add
968+ // delimiter character which is not allowed to be in
969+ // neither address or domain name.
970+ return []byte (c .nextConn .RemoteAddr ().String () + "_" + c .fsm .cfg .serverName )
971+ }
972+ return c .state .SessionID
973+ }
974+
963975// SetDeadline implements net.Conn.SetDeadline
964976func (c * Conn ) SetDeadline (t time.Time ) error {
965977 c .readDeadline .Set (t )
0 commit comments