Reject every() intervals that overflow int32 milliseconds

Char is rune (int32). Without an upper bound, secs * 1000 could
silently wrap to a non-positive value and panic time.NewTicker.
This commit is contained in:
Junegunn Choi
2026-05-16 17:58:31 +09:00
parent 38c88e4753
commit 463ef212b6
2 changed files with 7 additions and 4 deletions
+5 -2
View File
@@ -1315,8 +1315,11 @@ func parseEveryEvent(arg string) (tui.Event, error) {
if secs < 0.01 {
secs = 0.01
}
ms := int32(math.Round(secs * 1000))
return tui.Event{Type: tui.Every, Char: rune(ms)}, nil
ms := math.Round(secs * 1000)
if ms > math.MaxInt32 {
return tui.Event{}, errors.New("every() interval is too large")
}
return tui.Event{Type: tui.Every, Char: rune(int32(ms))}, nil
}
func parseScheme(str string) (string, []criterion, error) {
+2 -2
View File
@@ -323,8 +323,8 @@ func TestParseEveryEvent(t *testing.T) {
t.Errorf("every(0.001) should floor to 10ms")
}
// Reject zero and negatives
for _, bad := range []string{"every(0)", "every(-1)", "every(abc)", "every()"} {
// Reject zero, negatives, and overflow (>= 2^31 ms = ~24.85 days)
for _, bad := range []string{"every(0)", "every(-1)", "every(abc)", "every()", "every(2147484)"} {
if _, _, err := parseKeyChords(bad, ""); err == nil {
t.Errorf("%s should be rejected", bad)
}