From 316a0e33a440812c4df052287bd38960a2bbcff1 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Mon, 7 Jul 2025 17:39:51 -0600 Subject: [PATCH 1/4] Fix parsing when index expression is null --- .../common/xcontent/support/XContentMapValues.java | 3 +++ .../action/search/MultiSearchRequestTests.java | 9 +++++++++ .../org/elasticsearch/action/search/msearch-null.json | 2 ++ 3 files changed, 14 insertions(+) create mode 100644 server/src/test/resources/org/elasticsearch/action/search/msearch-null.json diff --git a/server/src/main/java/org/elasticsearch/common/xcontent/support/XContentMapValues.java b/server/src/main/java/org/elasticsearch/common/xcontent/support/XContentMapValues.java index a1ba3759c7854..74bf3b9b5ff62 100644 --- a/server/src/main/java/org/elasticsearch/common/xcontent/support/XContentMapValues.java +++ b/server/src/main/java/org/elasticsearch/common/xcontent/support/XContentMapValues.java @@ -560,6 +560,9 @@ public static Map nodeMapValue(Object node, String desc) { * Otherwise the node is treated as a comma-separated string. */ public static String[] nodeStringArrayValue(Object node) { + if (node == null) { + throw new ElasticsearchParseException("Expected a list of strings but got null"); + } if (isArray(node)) { List list = (List) node; String[] arr = new String[list.size()]; diff --git a/server/src/test/java/org/elasticsearch/action/search/MultiSearchRequestTests.java b/server/src/test/java/org/elasticsearch/action/search/MultiSearchRequestTests.java index 008230c5e3fe3..43f734f294ae4 100644 --- a/server/src/test/java/org/elasticsearch/action/search/MultiSearchRequestTests.java +++ b/server/src/test/java/org/elasticsearch/action/search/MultiSearchRequestTests.java @@ -9,6 +9,7 @@ package org.elasticsearch.action.search; +import org.elasticsearch.ElasticsearchParseException; import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.common.CheckedBiConsumer; import org.elasticsearch.common.Strings; @@ -537,6 +538,14 @@ public void testFailOnExtraCharacters() throws IOException { } } + public void testNullIndex() throws IOException { + try { + MultiSearchRequest request = parseMultiSearchRequest("/org/elasticsearch/action/search/msearch-null.json"); + } catch (ElasticsearchParseException e) { + assertThat(e.getMessage(), containsString("Expected a list of strings but got null")); + } + } + private static MultiSearchRequest mutate(MultiSearchRequest searchRequest) throws IOException { MultiSearchRequest mutation = copyRequest(searchRequest); List> mutators = new ArrayList<>(); diff --git a/server/src/test/resources/org/elasticsearch/action/search/msearch-null.json b/server/src/test/resources/org/elasticsearch/action/search/msearch-null.json new file mode 100644 index 0000000000000..d75d7bbe6f4b1 --- /dev/null +++ b/server/src/test/resources/org/elasticsearch/action/search/msearch-null.json @@ -0,0 +1,2 @@ +{"index": null} +{"query" : {"match_all" : {}}} From f2099b399e6d69e88e3438a1a73b32a44e2c1794 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Mon, 7 Jul 2025 17:44:30 -0600 Subject: [PATCH 2/4] Update docs/changelog/130776.yaml --- docs/changelog/130776.yaml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 docs/changelog/130776.yaml diff --git a/docs/changelog/130776.yaml b/docs/changelog/130776.yaml new file mode 100644 index 0000000000000..7c759150da70a --- /dev/null +++ b/docs/changelog/130776.yaml @@ -0,0 +1,6 @@ +pr: 130776 +summary: Fix msearch request parsing when index expression is null +area: "Infra/Core, Search" +type: bug +issues: + - 129631 From aab805cb55e5d8d039e9760e6deaa05457f8e44f Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Mon, 7 Jul 2025 17:45:50 -0600 Subject: [PATCH 3/4] Update 130776.yaml --- docs/changelog/130776.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog/130776.yaml b/docs/changelog/130776.yaml index 7c759150da70a..9d35a343e91d0 100644 --- a/docs/changelog/130776.yaml +++ b/docs/changelog/130776.yaml @@ -1,6 +1,6 @@ pr: 130776 summary: Fix msearch request parsing when index expression is null -area: "Infra/Core, Search" +area: Search type: bug issues: - 129631 From e13b05614c773ccd2f63128e0ff86d5c0e094ad2 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Tue, 8 Jul 2025 09:19:27 -0600 Subject: [PATCH 4/4] review feedback --- .../action/search/MultiSearchRequestTests.java | 10 +++++----- .../org/elasticsearch/action/search/msearch-null.json | 2 -- 2 files changed, 5 insertions(+), 7 deletions(-) delete mode 100644 server/src/test/resources/org/elasticsearch/action/search/msearch-null.json diff --git a/server/src/test/java/org/elasticsearch/action/search/MultiSearchRequestTests.java b/server/src/test/java/org/elasticsearch/action/search/MultiSearchRequestTests.java index 43f734f294ae4..3ed63ff5e90d1 100644 --- a/server/src/test/java/org/elasticsearch/action/search/MultiSearchRequestTests.java +++ b/server/src/test/java/org/elasticsearch/action/search/MultiSearchRequestTests.java @@ -539,11 +539,11 @@ public void testFailOnExtraCharacters() throws IOException { } public void testNullIndex() throws IOException { - try { - MultiSearchRequest request = parseMultiSearchRequest("/org/elasticsearch/action/search/msearch-null.json"); - } catch (ElasticsearchParseException e) { - assertThat(e.getMessage(), containsString("Expected a list of strings but got null")); - } + ElasticsearchParseException e = expectThrows(ElasticsearchParseException.class, () -> parseMultiSearchRequestFromString(""" + {"index": null} + { "query": {"match_all": {}}} + """)); + assertThat(e.getMessage(), containsString("Expected a list of strings but got null")); } private static MultiSearchRequest mutate(MultiSearchRequest searchRequest) throws IOException { diff --git a/server/src/test/resources/org/elasticsearch/action/search/msearch-null.json b/server/src/test/resources/org/elasticsearch/action/search/msearch-null.json deleted file mode 100644 index d75d7bbe6f4b1..0000000000000 --- a/server/src/test/resources/org/elasticsearch/action/search/msearch-null.json +++ /dev/null @@ -1,2 +0,0 @@ -{"index": null} -{"query" : {"match_all" : {}}}