From 7c84e24f484b954b00ff27740ce0c9a7f2ec021d Mon Sep 17 00:00:00 2001 From: Martynas Pumputis Date: Thu, 2 Mar 2017 15:02:53 +0000 Subject: [PATCH] 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. --- router/fastdp.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/router/fastdp.go b/router/fastdp.go index ffe28041..78785413 100644 --- a/router/fastdp.go +++ b/router/fastdp.go @@ -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) }