{"record":{"id":"344e8ccef8381f75","repo":"theonedev/onedev","slug":"skip-must-be-non-negative","errorCode":null,"errorMessage":"Skip must be non-negative.","messagePattern":"Skip must be non-negative\\.","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"server-core/src/main/java/org/eclipse/jgit/revwalk/filter/SkipRevFilter.java","lineNumber":39,"sourceCode":"/**\n * Filter that includes commits after a configured number are skipped.\n */\npublic class SkipRevFilter extends RevFilter {\n\n\tprivate final int skip;\n\n\tprivate int count;\n\n\t/**\n\t * Create a new skip filter.\n\t *\n\t * @param skip\n\t *            the number of commits to skip\n\t * @return a new filter\n\t */\n\tpublic static RevFilter create(int skip) {\n\t\tif (skip < 0)\n\t\t\tthrow new IllegalArgumentException(\n\t\t\t\t\tJGitText.get().skipMustBeNonNegative);\n\t\treturn new SkipRevFilter(skip);\n\t}\n\n\tprivate SkipRevFilter(int skip) {\n\t\tthis.skip = skip;\n\t}\n\n\t@Override\n\tpublic boolean include(RevWalk walker, RevCommit cmit)\n\t\t\tthrows StopWalkException, MissingObjectException,\n\t\t\tIncorrectObjectTypeException, IOException {\n\t\tif (skip > count++)\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\n\t@Override","sourceCodeStart":21,"sourceCodeEnd":57,"githubUrl":"https://github.com/theonedev/onedev/blob/d44925c47c37992c828ea673a5f9620539bc3ff2/server-core/src/main/java/org/eclipse/jgit/revwalk/filter/SkipRevFilter.java#L21-L57","documentation":"SkipRevFilter.create builds a filter that skips the first N commits during a rev walk. Negative skip counts are rejected because skipping a negative number of commits has no meaning. Passing a negative value throws IllegalArgumentException.","triggerScenarios":"Calling SkipRevFilter.create(skip) with a negative int, e.g. when deriving the skip count from pagination math (page-1)*pageSize that went negative, or from unvalidated user input.","commonSituations":"Pagination logic in a git history viewer where page number or page size from the client is negative or causes an underflow; unvalidated offset parameters.","solutions":["Clamp or validate the skip value to >= 0 before calling create","Fix pagination math to use Math.max(0, offset)","Validate user-supplied page/offset parameters at the boundary"],"exampleFix":"// before\nRevFilter f = SkipRevFilter.create((page - 1) * pageSize);\n// after\nint skip = Math.max(0, (page - 1) * Math.max(1, pageSize));\nRevFilter f = skip > 0 ? SkipRevFilter.create(skip) : RevFilter.NONE;","handlingStrategy":"validation","validationCode":"if (skip < 0) throw new IllegalArgumentException(\"skip must be >= 0, got \" + skip);","typeGuard":"boolean isValidSkip(int skip) { return skip >= 0; }","tryCatchPattern":"try { return SkipRevFilter.create(skip); } catch (IllegalArgumentException e) { return RevFilter.NONE; }","preventionTips":["Clamp derived offsets with Math.max(0, offset)","Validate page/pageSize parameters at the API boundary"],"tags":["jgit","revwalk","pagination","illegal-argument"],"backgroundTag":"argument-out-of-range","analyzedSha":"d44925c47c37992c828ea673a5f9620539bc3ff2","analyzedAt":"2026-09-06T07:18:27.995Z","contentChangedAt":"2026-09-06T07:18:27.995Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}