From f7a529f7ddc07ed78873a047d19bace81f52c9e6 Mon Sep 17 00:00:00 2001 From: Luca Cavanna Date: Thu, 10 Jul 2025 15:49:19 +0200 Subject: [PATCH] Check field data type before casting when applying geo distance sort (#130924) If a user tries to apply geo distance sorting to a field of the wrong type, they'll get a 500 error that causes shard failures, because the field data impl gets casted to the expected type without first checking that the field type is the one expected. This commit addresses that by returning a 400 error instead. Closes #129500 --- docs/changelog/130924.yaml | 6 ++++++ .../search/sort/GeoDistanceSortBuilder.java | 8 +++++++- .../search/sort/GeoDistanceSortBuilderTests.java | 10 ++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 docs/changelog/130924.yaml diff --git a/docs/changelog/130924.yaml b/docs/changelog/130924.yaml new file mode 100644 index 0000000000000..09b0f3b90533c --- /dev/null +++ b/docs/changelog/130924.yaml @@ -0,0 +1,6 @@ +pr: 130924 +summary: Check field data type before casting when applying geo distance sort +area: Search +type: bug +issues: + - 129500 diff --git a/server/src/main/java/org/elasticsearch/search/sort/GeoDistanceSortBuilder.java b/server/src/main/java/org/elasticsearch/search/sort/GeoDistanceSortBuilder.java index ab96638efe626..5e8256d3b9741 100644 --- a/server/src/main/java/org/elasticsearch/search/sort/GeoDistanceSortBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/sort/GeoDistanceSortBuilder.java @@ -624,7 +624,13 @@ private IndexGeoPointFieldData fieldData(SearchExecutionContext context) { throw new IllegalArgumentException("failed to find mapper for [" + fieldName + "] for geo distance based sort"); } } - return context.getForField(fieldType, MappedFieldType.FielddataOperation.SEARCH); + IndexFieldData indexFieldData = context.getForField(fieldType, MappedFieldType.FielddataOperation.SEARCH); + if (indexFieldData instanceof IndexGeoPointFieldData) { + return (IndexGeoPointFieldData) indexFieldData; + } + throw new IllegalArgumentException( + "unable to apply geo distance sort to field [" + fieldName + "] of type [" + fieldType.typeName() + "]" + ); } private Nested nested(SearchExecutionContext context) throws IOException { diff --git a/server/src/test/java/org/elasticsearch/search/sort/GeoDistanceSortBuilderTests.java b/server/src/test/java/org/elasticsearch/search/sort/GeoDistanceSortBuilderTests.java index 18f63821e721b..a46003770f2c7 100644 --- a/server/src/test/java/org/elasticsearch/search/sort/GeoDistanceSortBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/search/sort/GeoDistanceSortBuilderTests.java @@ -23,6 +23,7 @@ import org.elasticsearch.index.mapper.GeoPointFieldMapper; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.NestedPathFieldMapper; +import org.elasticsearch.index.mapper.NumberFieldMapper; import org.elasticsearch.index.query.GeoValidationMethod; import org.elasticsearch.index.query.MatchAllQueryBuilder; import org.elasticsearch.index.query.MatchNoneQueryBuilder; @@ -99,6 +100,9 @@ public static GeoDistanceSortBuilder randomGeoDistanceSortBuilder() { @Override protected MappedFieldType provideMappedFieldType(String name) { + if (name.equals("double")) { + return new NumberFieldMapper.NumberFieldType(name, NumberFieldMapper.NumberType.DOUBLE); + } return new GeoPointFieldMapper.GeoPointFieldType(name); } @@ -531,6 +535,12 @@ public void testBuildInvalidPoints() throws IOException { ); assertEquals("illegal longitude value [-360.0] for [GeoDistanceSort] for field [fieldName].", ex.getMessage()); } + { + GeoDistanceSortBuilder sortBuilder = new GeoDistanceSortBuilder("double", 0.0, 180.0); + sortBuilder.validation(GeoValidationMethod.STRICT); + IllegalArgumentException ex = expectThrows(IllegalArgumentException.class, () -> sortBuilder.build(searchExecutionContext)); + assertEquals("unable to apply geo distance sort to field [double] of type [double]", ex.getMessage()); + } } /**