diff options
| author | Taras Madan <tarasmadan@google.com> | 2023-10-27 17:14:09 +0200 |
|---|---|---|
| committer | Taras Madan <tarasmadan@google.com> | 2023-10-30 11:13:38 +0000 |
| commit | b5729d823e22b9aada3c12f2bbb218c278df1acf (patch) | |
| tree | 12ce6e01e2c2d89dc76e0eb881f50d967c3b8cd0 /pkg/csource | |
| parent | 376ad51803a0e7f2bc6b1719f96fa9169568e4da (diff) | |
pkg/csource/options.go: refactor deserializeLegacyFormats
It contributes to #4285 unblocking.
Diffstat (limited to 'pkg/csource')
| -rw-r--r-- | pkg/csource/options.go | 104 |
1 files changed, 45 insertions, 59 deletions
diff --git a/pkg/csource/options.go b/pkg/csource/options.go index 9a43c65fc..9490e394a 100644 --- a/pkg/csource/options.go +++ b/pkg/csource/options.go @@ -204,63 +204,49 @@ func (opts Options) Serialize() []byte { return data } -func deserializeLegacyOptions1(data string, opts *Options) error { - waitRepeat, debug := false, false - n, err := fmt.Sscanf(data, - "{Threaded:%t Collide:%t Repeat:%t Procs:%d Sandbox:%s"+ - " Fault:%t FaultCall:%d FaultNth:%d EnableTun:%t UseTmpDir:%t"+ - " HandleSegv:%t WaitRepeat:%t Debug:%t Repro:%t}", - &opts.Threaded, &opts.Collide, &opts.Repeat, &opts.Procs, &opts.Sandbox, - &opts.Fault, &opts.FaultCall, &opts.FaultNth, &opts.NetInjection, &opts.UseTmpDir, - &opts.HandleSegv, &waitRepeat, &debug, &opts.Repro) - - if err == nil { - if want := 14; n != want { - return fmt.Errorf("failed to parse repro options: got %v fields, want %v", n, want) - } +func deserializeLegacyOptions(data string, opts *Options) (int, error) { + ignoreBool := true + keyToTarget := map[string]any{ + "Threaded": &opts.Threaded, + "Collide": &opts.Collide, + "Repeat": &opts.Repeat, + "Procs": &opts.Procs, + "Sandbox": &opts.Sandbox, + "SandboxArg": &opts.SandboxArg, + "Fault": &opts.Fault, + "FaultCall": &opts.FaultCall, + "FaultNth": &opts.FaultNth, + "EnableTun": &opts.NetInjection, + "UseTmpDir": &opts.UseTmpDir, + "EnableCgroups": &opts.Cgroups, + "HandleSegv": &opts.HandleSegv, + "WaitRepeat": &ignoreBool, + "Debug": &ignoreBool, + "Repro": &opts.Repro, } - return err -} -func deserializeLegacyOptions2(data string, opts *Options) error { - waitRepeat, debug := false, false - n, err := fmt.Sscanf(data, - "{Threaded:%t Collide:%t Repeat:%t Procs:%d Sandbox:%s"+ - " Fault:%t FaultCall:%d FaultNth:%d EnableTun:%t UseTmpDir:%t"+ - " EnableCgroups:%t HandleSegv:%t WaitRepeat:%t Debug:%t Repro:%t}", - &opts.Threaded, &opts.Collide, &opts.Repeat, &opts.Procs, &opts.Sandbox, - &opts.Fault, &opts.FaultCall, &opts.FaultNth, &opts.NetInjection, &opts.UseTmpDir, - &opts.Cgroups, &opts.HandleSegv, &waitRepeat, &debug, &opts.Repro) - if err == nil { - if want := 15; n != want { - return fmt.Errorf("failed to parse repro options 2: got %v fields, want %v", n, want) + data = strings.TrimSpace(data) + data = strings.TrimPrefix(data, "{") + data = strings.TrimSuffix(data, "}") + totalRead := 0 + for _, token := range strings.Fields(data) { + key, value, keyValueFound := strings.Cut(token, ":") + if !keyValueFound { + return totalRead, fmt.Errorf("error splitting options token %v", token) } - } - return err -} - -// Android format. -func deserializeLegacyOptions3(data string, opts *Options) error { - waitRepeat, debug := false, false - n, err := fmt.Sscanf(data, - "{Threaded:%t Collide:%t Repeat:%t Procs:%d Sandbox:%s SandboxArg:%d"+ - " Fault:%t FaultCall:%d FaultNth:%d EnableTun:%t UseTmpDir:%t"+ - " EnableCgroups:%t HandleSegv:%t WaitRepeat:%t Debug:%t Repro:%t}", - &opts.Threaded, &opts.Collide, &opts.Repeat, &opts.Procs, &opts.Sandbox, &opts.SandboxArg, - &opts.Fault, &opts.FaultCall, &opts.FaultNth, &opts.NetInjection, &opts.UseTmpDir, - &opts.Cgroups, &opts.HandleSegv, &waitRepeat, &debug, &opts.Repro) - if err == nil { - if want := 16; n != want { - return fmt.Errorf("failed to parse repro options 3: got %v fields, want %v", n, want) + if _, ok := keyToTarget[key]; !ok { + return totalRead, fmt.Errorf("error, unexpected option key %v", key) + } + dest := keyToTarget[key] + n, err := fmt.Sscanf(value, "%v", dest) + if err != nil { + return totalRead, fmt.Errorf("failed to read %v", value) } + totalRead += n + delete(keyToTarget, key) } - return err -} -var parsers = []func(string, *Options) error{ - deserializeLegacyOptions1, - deserializeLegacyOptions2, - deserializeLegacyOptions3, + return totalRead, nil } // Support for legacy formats. @@ -269,14 +255,14 @@ func deserializeLegacyFormats(data []byte, opts *Options) error { strData := string(data) // We can distinguish between legacy formats by the number - // of fields. The formats we support have 14, 15 and 16. - // Each field can be recognized by ':' char. - version := strings.Count(strData, ":") - if version < 14 || version > 16 { - return fmt.Errorf("unrecognized options format") - } - index := version - 14 - err := parsers[index](strData, opts) + // of fields. The formats we support have 14, 15 and 16 fields. + fieldsFound, err := deserializeLegacyOptions(strData, opts) + if err != nil { + return fmt.Errorf("failed to parse '%v': %w", strData, err) + } + if fieldsFound < 14 || fieldsFound > 16 { + return fmt.Errorf("%v params found, expected 14 <= x <= 16", fieldsFound) + } if opts.Sandbox == "empty" { opts.Sandbox = "" |
