summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph Büscher <christoph@elastic.co>2017-02-27 09:45:10 +0100
committerGitHub <noreply@github.com>2017-02-27 09:45:10 +0100
commit641c88dc29012c8ea410969a687c763355e2e7ee (patch)
treee732b1bd71a4637a4b4f46e60241a8d62d9be2f8
parent396b8b371cba3f5524334d55239e9ba8b3b7fa1c (diff)
Prevent negative `from` parameter in SearchSourceBuilder (#23358)
This prevents later errors like the one reported in #23324 and throws an IllegalArgumentException early instead.
-rw-r--r--core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java5
-rw-r--r--core/src/test/java/org/elasticsearch/search/builder/SearchSourceBuilderTests.java5
-rw-r--r--rest-api-spec/src/main/resources/rest-api-spec/test/search/30_limits.yaml8
3 files changed, 17 insertions, 1 deletions
diff --git a/core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java b/core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java
index abfbd37671..37d7eb5b02 100644
--- a/core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java
+++ b/core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java
@@ -38,11 +38,11 @@ import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryParseContext;
import org.elasticsearch.index.query.QueryShardContext;
import org.elasticsearch.script.Script;
-import org.elasticsearch.search.collapse.CollapseBuilder;
import org.elasticsearch.search.SearchExtBuilder;
import org.elasticsearch.search.aggregations.AggregationBuilder;
import org.elasticsearch.search.aggregations.AggregatorFactories;
import org.elasticsearch.search.aggregations.PipelineAggregationBuilder;
+import org.elasticsearch.search.collapse.CollapseBuilder;
import org.elasticsearch.search.fetch.StoredFieldsContext;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
@@ -314,6 +314,9 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ
* From index to start the search from. Defaults to <tt>0</tt>.
*/
public SearchSourceBuilder from(int from) {
+ if (from < 0) {
+ throw new IllegalArgumentException("[from] parameter cannot be negative");
+ }
this.from = from;
return this;
}
diff --git a/core/src/test/java/org/elasticsearch/search/builder/SearchSourceBuilderTests.java b/core/src/test/java/org/elasticsearch/search/builder/SearchSourceBuilderTests.java
index ef1750a448..cb4982d769 100644
--- a/core/src/test/java/org/elasticsearch/search/builder/SearchSourceBuilderTests.java
+++ b/core/src/test/java/org/elasticsearch/search/builder/SearchSourceBuilderTests.java
@@ -360,6 +360,11 @@ public class SearchSourceBuilderTests extends AbstractSearchTestCase {
}
}
+ public void testNegativeFromErrors() {
+ IllegalArgumentException expected = expectThrows(IllegalArgumentException.class, () -> new SearchSourceBuilder().from(-2));
+ assertEquals("[from] parameter cannot be negative", expected.getMessage());
+ }
+
private void assertIndicesBoostParseErrorMessage(String restContent, String expectedErrorMessage) throws IOException {
try (XContentParser parser = createParser(JsonXContent.jsonXContent, restContent)) {
ParsingException e = expectThrows(ParsingException.class, () -> SearchSourceBuilder.fromXContent(createParseContext(parser)));
diff --git a/rest-api-spec/src/main/resources/rest-api-spec/test/search/30_limits.yaml b/rest-api-spec/src/main/resources/rest-api-spec/test/search/30_limits.yaml
index a93cefff69..49c9333c48 100644
--- a/rest-api-spec/src/main/resources/rest-api-spec/test/search/30_limits.yaml
+++ b/rest-api-spec/src/main/resources/rest-api-spec/test/search/30_limits.yaml
@@ -18,6 +18,14 @@ setup:
from: 10000
---
+"Request with negative from value":
+ - do:
+ catch: /\[from\] parameter cannot be negative/
+ search:
+ index: test_1
+ from: -2
+
+---
"Request window limits with scroll":
- do:
catch: /Batch size is too large, size must be less than or equal to[:] \[10000\] but was \[10010\]\. Scroll batch sizes cost as much memory as result windows so they are controlled by the \[index.max_result_window\] index level setting\./