diff --git a/api/pagination/pagination.go b/api/pagination/pagination.go index 40bb1ee88d..f595f7b7de 100644 --- a/api/pagination/pagination.go +++ b/api/pagination/pagination.go @@ -15,6 +15,9 @@ func StartAndEndPage(pageToken string, pageSize, totalSize int) (int, int, strin if pageToken == "" { pageToken = "0" } + if pageSize < 0 || totalSize < 0 { + return 0, 0, "", errors.Errorf("invalid page and total sizes provided: page size %d , total size %d", pageSize, totalSize) + } if pageSize == 0 { pageSize = params.BeaconConfig().DefaultPageSize } @@ -23,6 +26,9 @@ func StartAndEndPage(pageToken string, pageSize, totalSize int) (int, int, strin if err != nil { return 0, 0, "", errors.Wrap(err, "could not convert page token") } + if token < 0 { + return 0, 0, "", errors.Errorf("invalid token value provided: %d", token) + } // Start page can not be greater than set size. start := token * pageSize diff --git a/api/pagination/pagination_test.go b/api/pagination/pagination_test.go index daca9c28ab..c3a7a81a36 100644 --- a/api/pagination/pagination_test.go +++ b/api/pagination/pagination_test.go @@ -85,3 +85,19 @@ func TestStartAndEndPage_ExceedsMaxPage(t *testing.T) { _, _, _, err := pagination.StartAndEndPage("", 0, 0) assert.ErrorContains(t, wanted, err) } + +func TestStartAndEndPage_InvalidPageValues(t *testing.T) { + _, _, _, err := pagination.StartAndEndPage("10", -1, 10) + assert.ErrorContains(t, "invalid page and total sizes provided", err) + + _, _, _, err = pagination.StartAndEndPage("12", 10, -10) + assert.ErrorContains(t, "invalid page and total sizes provided", err) + + _, _, _, err = pagination.StartAndEndPage("12", -50, -60) + assert.ErrorContains(t, "invalid page and total sizes provided", err) +} + +func TestStartAndEndPage_InvalidTokenValue(t *testing.T) { + _, _, _, err := pagination.StartAndEndPage("-12", 50, 60) + assert.ErrorContains(t, "invalid token value provided", err) +}