fastdp: Do not reset heartbeat timer for non-confirmed connections
It is possible to receive FastDatapathCryptoInitSARemote control plane message before Confirm'ing a connection. In such case, resetting heartbeatTimer leads to null pointer dereference, as the timer is initialized during Confirm'ation. In this situation, skipping the reset is non-harmful, because Confirm'ing will reset it. NB: the reset to 0 should only happen after establishing the connection on both ends.
This commit is contained in:
1 parent
125f3cf6f6
commit
7c84e24f48
1 file changed
+5
-3
+5
-3
@@ -577,8 +577,8 @@ type fastDatapathForwarder struct {
|
||||
confirmed bool
|
||||
remoteAddr *net.UDPAddr
|
||||
heartbeatInterval time.Duration
|
||||
heartbeatTimer *time.Timer
|
||||
heartbeatTimeout *time.Timer
|
||||
heartbeatTimer *time.Timer // for sending
|
||||
heartbeatTimeout *time.Timer // for receiving
|
||||
ackedHeartbeat bool
|
||||
stopChan chan struct{}
|
||||
stopped bool
|
||||
@@ -856,7 +856,9 @@ func (fwd *fastDatapathForwarder) handleCryptoInitSARemote(msg []byte) {
|
||||
return
|
||||
}
|
||||
|
||||
if !fwd.isOutboundIPSecEstablished {
|
||||
// FastDatapathCryptoInitSARemote can be received before Confirm'ing
|
||||
// connection, thus before InitSALocal.
|
||||
if fwd.confirmed && !fwd.isOutboundIPSecEstablished {
|
||||
fwd.isOutboundIPSecEstablished = true
|
||||
fwd.heartbeatTimer.Reset(0)
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user