diff --git a/changelog/unreleased/pull-22163 b/changelog/unreleased/pull-22163 new file mode 100644 index 000000000..af642f111 --- /dev/null +++ b/changelog/unreleased/pull-22163 @@ -0,0 +1,7 @@ +Bugfix: Report an error for too large numbers in `--keep-within*` durations + +Restic crashed with a stack trace when a number in a duration such as the one +passed to `restic forget --keep-within` did not fit into an integer. It now +reports an invalid argument instead. + +https://github.com/restic/restic/pull/22163 diff --git a/internal/data/duration.go b/internal/data/duration.go index 9762b70e6..d912f3007 100644 --- a/internal/data/duration.go +++ b/internal/data/duration.go @@ -65,7 +65,7 @@ func nextNumber(input string) (num int, rest string, err error) { num, err = strconv.Atoi(n) if err != nil { - panic(err) + return 0, input, err } if negative { diff --git a/internal/data/duration_test.go b/internal/data/duration_test.go index bd421bd91..15cb8b328 100644 --- a/internal/data/duration_test.go +++ b/internal/data/duration_test.go @@ -40,6 +40,9 @@ func TestNextNumber(t *testing.T) { { input: "5", num: 5, rest: "", }, + { + input: "99999999999999999999999999y", num: 0, rest: "99999999999999999999999999y", err: true, + }, } for _, test := range tests { @@ -82,6 +85,8 @@ func TestParseDuration(t *testing.T) { {input: "1y4m3w1d", err: true}, {input: "s", err: true}, {input: "\xdf\x80", err: true}, // NKO DIGIT ZERO; we want ASCII digits + {input: "99999999999999999999999999y", err: true}, + {input: "1y-99999999999999999999999999d", err: true}, } for _, test := range tests {