[client] Fall back to download-only on a malformed expected version

This commit is contained in:
Zoltán Papp
2026-10-05 15:22:00 +02:00
parent 19a81d1c66
commit 1b380ddbdb
2 changed files with 29 additions and 1 deletions
+6 -1
View File
@@ -190,7 +190,12 @@ func (m *Manager) SetVersion(expectedVersion string, forceUpdate bool) {
if expectedVersion != latestVersion {
parsed, err := v.NewVersion(expectedVersion)
if err != nil {
log.Errorf("error parsing version: %v", err)
log.Errorf("error parsing version, switching to download-only: %v", err)
m.setModeLocked(modeDownloadOnly)
select {
case m.mgmUpdateChan <- struct{}{}:
default:
}
return
}
if m.mode == modeManaged && m.expectedVersion != nil && m.expectedVersion.Equal(parsed) {
@@ -152,3 +152,26 @@ func Test_ResetMode_SilencesStaleForceDirective(t *testing.T) {
t.Fatalf("expected enforced event after a fresh directive, got %q enforced=%v", ver, enforced)
}
}
func Test_SetVersion_MalformedFallsBackToDownloadOnly(t *testing.T) {
tmpFile := path.Join(t.TempDir(), "update-test-malformed.json")
recorder := peer.NewRecorder("")
sub := recorder.SubscribeToEvents()
defer recorder.UnsubscribeFromEvents(sub)
m := NewManager(recorder, statemanager.New(tmpFile))
m.update = &versionUpdateMock{latestVersion: v.Must(v.NewSemver("1.0.1"))}
m.currentVersion = "1.0.0"
m.autoUpdateSupported = func() bool { return true }
m.Start(context.Background())
defer m.Stop()
m.SetVersion("not-a-version", false)
ver, enforced := waitForUpdateEvent(sub, 500*time.Millisecond)
if ver != "1.0.1" {
t.Fatalf("expected download-only event for 1.0.1 after malformed version, got %q", ver)
}
if enforced {
t.Error("malformed version fallback must not carry enforced metadata")
}
}