Skip to content

Commit 3db728d

Browse files
committed
test(fuzz): add native Go fuzzing target for urunc config parsing
Signed-off-by: ParthMozarkar <greatparth21@gmail.com>
1 parent 3c2a37f commit 3db728d

2 files changed

Lines changed: 72 additions & 0 deletions

File tree

pkg/unikontainers/urunc_config.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,27 @@ func defaultUruncConfig() *UruncConfig {
108108
}
109109
}
110110

111+
// ParseUruncConfigBytes parses the urunc configuration from a byte slice (TOML format).
112+
// If decoding fails, it returns the default configuration alongside the error.
113+
func ParseUruncConfigBytes(data []byte) (*UruncConfig, error) {
114+
cfg := defaultUruncConfig()
115+
_, err := toml.Decode(string(data), cfg)
116+
if err != nil {
117+
return defaultUruncConfig(), err
118+
}
119+
for name, mon := range cfg.Monitors {
120+
if mon.DefaultMemoryMB == 0 {
121+
mon.DefaultMemoryMB = defaultMonitorMemoryMB
122+
}
123+
if mon.DefaultVCPUs == 0 {
124+
mon.DefaultVCPUs = defaultMonitorVCPUs
125+
}
126+
cfg.Monitors[name] = mon
127+
}
128+
129+
return cfg, nil
130+
}
131+
111132
// LoadUruncConfig loads the urunc configuration from the specified path.
112133
// If the file does not exist or is malformed, it returns the default configuration.
113134
func LoadUruncConfig(path string) (*UruncConfig, error) {

pkg/unikontainers/urunc_config_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -618,3 +618,54 @@ path = "/usr/bin/mon"
618618
assert.Equal(t, defaultMonitorsConfig(), config.Monitors)
619619
})
620620
}
621+
622+
func TestParseUruncConfigBytes(t *testing.T) {
623+
t.Run("valid toml bytes", func(t *testing.T) {
624+
t.Parallel()
625+
data := []byte(`
626+
[log]
627+
level = "debug"
628+
syslog = true
629+
630+
[monitors.qemu]
631+
default_memory_mb = 512
632+
default_vcpus = 2
633+
`)
634+
config, err := ParseUruncConfigBytes(data)
635+
assert.NoError(t, err)
636+
assert.Equal(t, "debug", config.Log.Level)
637+
assert.True(t, config.Log.Syslog)
638+
assert.Equal(t, uint(512), config.Monitors["qemu"].DefaultMemoryMB)
639+
})
640+
641+
t.Run("invalid toml bytes returns default config and error", func(t *testing.T) {
642+
t.Parallel()
643+
data := []byte(`invalid toml [syntax`)
644+
config, err := ParseUruncConfigBytes(data)
645+
assert.Error(t, err)
646+
assert.NotNil(t, config)
647+
assert.Equal(t, defaultMonitorsConfig(), config.Monitors)
648+
})
649+
}
650+
651+
func FuzzLoadUruncConfig(f *testing.F) {
652+
// Seed corpus with valid TOML configurations and edge cases
653+
f.Add([]byte(""))
654+
f.Add([]byte("[log]\nlevel = \"debug\"\nsyslog = true\n"))
655+
f.Add([]byte("[monitors.qemu]\ndefault_memory_mb = 512\ndefault_vcpus = 2\npath = \"/usr/bin/qemu\"\n"))
656+
f.Add([]byte("[extra_binaries.virtiofsd]\npath = \"/usr/libexec/virtiofsd\"\noptions = \"--cache always\"\n"))
657+
f.Add([]byte("[monitors.custom]\ndefault_memory_mb = 0\ndefault_vcpus = 0\n"))
658+
659+
f.Fuzz(func(t *testing.T, data []byte) {
660+
cfg, err := ParseUruncConfigBytes(data)
661+
if err != nil {
662+
if cfg == nil {
663+
t.Fatalf("ParseUruncConfigBytes returned nil config on error")
664+
}
665+
return
666+
}
667+
// Invariant: parsed config must produce valid map representation without panics
668+
_ = cfg.Map()
669+
})
670+
}
671+

0 commit comments

Comments
 (0)