Fix empty active state read

This commit is contained in:
Theodor S. Midtlien
2026-09-15 16:10:49 +02:00
parent 106dd0365d
commit de66ba9457
2 changed files with 20 additions and 2 deletions
+5 -2
View File
@@ -746,7 +746,9 @@ func (g *BundleGenerator) addProfiles() error {
return fmt.Errorf("add profiles file to zip: %w", err)
}
if len(activeRaw) == 0 {
// A file that is present but empty still says something: the state was
// truncated rather than never written.
if activeRaw == nil {
return nil
}
if err := g.addFileToZip(bytes.NewReader(activeRaw), activeProfileBundleFile); err != nil {
@@ -759,7 +761,8 @@ func (g *BundleGenerator) addProfiles() error {
// readActiveProfileState reads the state file directly rather than through
// ServiceManager, whose getters seed a default one when it is missing. Bundle
// collection must not write the state it reports on. The raw bytes come back
// even when parsing fails, so a corrupted file still reaches the bundle.
// even when parsing fails, so a corrupted file still reaches the bundle, and
// they are nil only when nothing was read at all.
func readActiveProfileState() (*profilemanager.ActiveProfileState, []byte, error) {
data, err := os.ReadFile(profilemanager.ActiveProfileStatePath)
if err != nil {
+15
View File
@@ -1105,6 +1105,21 @@ func TestAddProfiles(t *testing.T) {
assert.NotContains(t, files, activeProfileBundleFile, "no state file means nothing to dump")
})
t.Run("keeps an empty active profile state file", func(t *testing.T) {
dir := setupProfilesDir(t)
writeProfileJSON(t, filepath.Join(dir, "alice", "aaaa1111.json"), "work", []string{"uid:1000"})
// A truncated write leaves the file in place with no content. The bundle
// has to show that, not look like the file was never written.
require.NoError(t, os.WriteFile(profilemanager.ActiveProfileStatePath, nil, 0o600))
files := bundleFiles(t, (*BundleGenerator).addProfiles)
raw, ok := files[activeProfileBundleFile]
assert.True(t, ok, "an empty state file should still be dumped")
assert.Empty(t, raw)
assert.Contains(t, files[profilesBundleFile], "Active profile: unknown")
})
t.Run("records a parse error and keeps the other profiles", func(t *testing.T) {
dir := setupProfilesDir(t)
require.NoError(t, os.MkdirAll(filepath.Join(dir, "alice"), 0o700))