diff --git a/server/src/main/java/org/elasticsearch/index/mapper/RootObjectMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/RootObjectMapper.java index cd3242e98a2d7..27afb49e36998 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/RootObjectMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/RootObjectMapper.java @@ -168,6 +168,9 @@ protected boolean processField(RootObjectMapper.Builder builder, String fieldNam } ] */ + if ((fieldNode instanceof List) == false) { + throw new MapperParsingException("Dynamic template syntax error. An array of named objects is expected."); + } List tmplNodes = (List) fieldNode; List templates = new ArrayList<>(); for (Object tmplNode : tmplNodes) { diff --git a/server/src/test/java/org/elasticsearch/index/mapper/RootObjectMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/RootObjectMapperTests.java index 0b805eb726646..a8bd8f5a0e2d3 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/RootObjectMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/RootObjectMapperTests.java @@ -185,4 +185,19 @@ public void testIllegalFormatField() throws Exception { assertEquals("Invalid format: [[test_format]]: expected string value", e.getMessage()); } } + + public void testIllegalDynamicTemplates() throws Exception { + String mapping = Strings.toString(XContentFactory.jsonBuilder() + .startObject() + .startObject("type") + .startObject("dynamic_templates") + .endObject() + .endObject() + .endObject()); + + DocumentMapperParser parser = createIndex("test").mapperService().documentMapperParser(); + MapperParsingException e = expectThrows(MapperParsingException.class, + () -> parser.parse("type", new CompressedXContent(mapping))); + assertEquals("Dynamic template syntax error. An array of named objects is expected.", e.getMessage()); + } }