Fix nil pointer exception in expectedSemVer

This commit is contained in:
Zoltán Papp
2025-10-13 20:25:59 +02:00
parent 6200aaf0b0
commit 7d846bf9ba

View File

@@ -57,7 +57,9 @@ type UpdateManager struct {
expectedVersion *v.Version expectedVersion *v.Version
updateToLatestVersion bool updateToLatestVersion bool
expectedVersionMutex sync.Mutex
// updateMutex protect update and expectedVersion fields
updateMutex sync.Mutex
} }
func NewUpdateManager(statusRecorder *peer.Status, stateManager *statemanager.Manager) *UpdateManager { func NewUpdateManager(statusRecorder *peer.Status, stateManager *statemanager.Manager) *UpdateManager {
@@ -103,8 +105,8 @@ func (u *UpdateManager) SetVersion(expectedVersion string) {
return return
} }
u.expectedVersionMutex.Lock() u.updateMutex.Lock()
defer u.expectedVersionMutex.Unlock() defer u.updateMutex.Unlock()
if expectedVersion == latestVersion { if expectedVersion == latestVersion {
u.updateToLatestVersion = true u.updateToLatestVersion = true
u.expectedVersion = nil u.expectedVersion = nil
@@ -114,7 +116,7 @@ func (u *UpdateManager) SetVersion(expectedVersion string) {
log.Errorf("Error parsing version: %v", err) log.Errorf("Error parsing version: %v", err)
return return
} }
if u.expectedVersion.Equal(expectedSemVer) { if u.expectedVersion != nil && u.expectedVersion.Equal(expectedSemVer) {
return return
} }
u.expectedVersion = expectedSemVer u.expectedVersion = expectedSemVer
@@ -133,12 +135,12 @@ func (u *UpdateManager) Stop() {
} }
u.cancel() u.cancel()
u.expectedVersionMutex.Lock() u.updateMutex.Lock()
if u.update != nil { if u.update != nil {
u.update.StopWatch() u.update.StopWatch()
u.update = nil u.update = nil
} }
u.expectedVersionMutex.Unlock() u.updateMutex.Unlock()
u.wg.Wait() u.wg.Wait()
} }
@@ -148,8 +150,8 @@ func (u *UpdateManager) onContextCancel() {
return return
} }
u.expectedVersionMutex.Lock() u.updateMutex.Lock()
defer u.expectedVersionMutex.Unlock() defer u.updateMutex.Unlock()
if u.update != nil { if u.update != nil {
u.update.StopWatch() u.update.StopWatch()
u.update = nil u.update = nil
@@ -175,15 +177,16 @@ func (u *UpdateManager) updateLoop(ctx context.Context) {
func (u *UpdateManager) handleUpdate(ctx context.Context) { func (u *UpdateManager) handleUpdate(ctx context.Context) {
var updateVersion *v.Version var updateVersion *v.Version
u.expectedVersionMutex.Lock() u.updateMutex.Lock()
if u.update == nil { if u.update == nil {
u.expectedVersionMutex.Unlock() u.updateMutex.Unlock()
return return
} }
expectedVersion := u.expectedVersion expectedVersion := u.expectedVersion
useLatest := u.updateToLatestVersion useLatest := u.updateToLatestVersion
curLatestVersion := u.update.LatestVersion() curLatestVersion := u.update.LatestVersion()
u.expectedVersionMutex.Unlock() u.updateMutex.Unlock()
switch { switch {
// Resolve "latest" to actual version // Resolve "latest" to actual version
@@ -194,7 +197,7 @@ func (u *UpdateManager) handleUpdate(ctx context.Context) {
} }
updateVersion = curLatestVersion updateVersion = curLatestVersion
// Update to specific version // Update to specific version
case u.expectedVersion != nil: case expectedVersion != nil:
updateVersion = expectedVersion updateVersion = expectedVersion
default: default:
log.Debugf("No expected version information set") log.Debugf("No expected version information set")