From 3085ad8955cba641f4dcdfb55ebe7e540016ca6d Mon Sep 17 00:00:00 2001 From: Nikolaus Schuetz Date: Wed, 26 Aug 2026 14:50:22 -0400 Subject: [PATCH] Initialize the target map when a StringToString flag has a nil default stringToStringValue.Set wrote into *s.value directly, so a StringToString flag declared with a nil default map panicked with "assignment to entry in nil map" the first time it was set. Allocate the map when it is nil before merging parsed values, and cover the nil-default case in a test. --- string_to_string.go | 3 +++ string_to_string_test.go | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/string_to_string.go b/string_to_string.go index 518e1366..e3765754 100644 --- a/string_to_string.go +++ b/string_to_string.go @@ -55,6 +55,9 @@ func (s *stringToStringValue) Set(val string) error { } } + if *s.value == nil { + *s.value = make(map[string]string, len(out)) + } for k, v := range out { (*s.value)[k] = v } diff --git a/string_to_string_test.go b/string_to_string_test.go index d3346d63..3e7659ec 100644 --- a/string_to_string_test.go +++ b/string_to_string_test.go @@ -374,6 +374,20 @@ func TestS2SWithDefault(t *testing.T) { } } +func TestS2SNilDefault(t *testing.T) { + var s2s map[string]string + f := NewFlagSet("test", ContinueOnError) + f.StringToStringVar(&s2s, "s2s", nil, "Command separated ls!") + + arg := fmt.Sprintf("--s2s=%s", createS2SFlag(map[string]string{"a": "1", "b": "2"})) + if err := f.Parse([]string{arg}); err != nil { + t.Fatal("expected no error; got", err) + } + if s2s["a"] != "1" || s2s["b"] != "2" { + t.Fatalf("expected a=1,b=2 but got: %v", s2s) + } +} + func TestS2SCalledTwice(t *testing.T) { var s2s map[string]string f := setUpS2SFlagSet(&s2s)