diff --git a/src/flag/flag.go b/src/flag/flag.go index bbbc55a279..b166c5753a 100644 --- a/src/flag/flag.go +++ b/src/flag/flag.go @@ -114,7 +114,7 @@ func newIntValue(val int, p *int) *intValue { } func (i *intValue) Set(s string) error { - v, err := strconv.ParseInt(s, 0, 64) + v, err := strconv.ParseInt(s, 0, strconv.IntSize) *i = intValue(v) return err } @@ -150,7 +150,7 @@ func newUintValue(val uint, p *uint) *uintValue { } func (i *uintValue) Set(s string) error { - v, err := strconv.ParseUint(s, 0, 64) + v, err := strconv.ParseUint(s, 0, strconv.IntSize) *i = uintValue(v) return err } diff --git a/src/flag/flag_test.go b/src/flag/flag_test.go index e2319ec94c..02da2c7750 100644 --- a/src/flag/flag_test.go +++ b/src/flag/flag_test.go @@ -10,6 +10,7 @@ import ( "fmt" "os" "sort" + "strconv" "strings" "testing" "time" @@ -415,3 +416,19 @@ func TestPrintDefaults(t *testing.T) { t.Errorf("got %q want %q\n", got, defaultOutput) } } + +// Issue 19230: validate range of Int and Uint flag values. +func TestIntFlagOverflow(t *testing.T) { + if strconv.IntSize != 32 { + return + } + ResetForTesting(nil) + Int("i", 0, "") + Uint("u", 0, "") + if err := Set("i", "2147483648"); err == nil { + t.Error("unexpected success setting Int") + } + if err := Set("u", "4294967296"); err == nil { + t.Error("unexpected success setting Uint") + } +}