From f3d037ba7d1105dc440ae54a235d954a8df08a71 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Wed, 11 Apr 2012 18:17:50 +0200 Subject: [PATCH] DATACMNS-139 - Fixed potential StackOverflowException in PropertyPath. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When trying to access an inexistent property starting with an underscore (e.g. _id) PropertyPath.create(…) ran into a StackOverflowException. Changed the traversing regular expression to expect at least one capital letter for further traversals. --- .../data/mapping/PropertyPath.java | 2 +- .../data/mapping/PropertyUnitTests.java | 42 +++++++++++++++++-- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/spring-data-commons-core/src/main/java/org/springframework/data/mapping/PropertyPath.java b/spring-data-commons-core/src/main/java/org/springframework/data/mapping/PropertyPath.java index 31e9f9260..0a98d1129 100644 --- a/spring-data-commons-core/src/main/java/org/springframework/data/mapping/PropertyPath.java +++ b/spring-data-commons-core/src/main/java/org/springframework/data/mapping/PropertyPath.java @@ -321,7 +321,7 @@ public class PropertyPath implements Iterable { exception = e; } - Pattern pattern = Pattern.compile("[A-Z]?[a-z]*$"); + Pattern pattern = Pattern.compile("[A-Z]+[a-z]*$"); Matcher matcher = pattern.matcher(source); if (matcher.find() && matcher.start() != 0) { diff --git a/spring-data-commons-core/src/test/java/org/springframework/data/mapping/PropertyUnitTests.java b/spring-data-commons-core/src/test/java/org/springframework/data/mapping/PropertyUnitTests.java index 1c0273475..043263c9b 100644 --- a/spring-data-commons-core/src/test/java/org/springframework/data/mapping/PropertyUnitTests.java +++ b/spring-data-commons-core/src/test/java/org/springframework/data/mapping/PropertyUnitTests.java @@ -18,14 +18,11 @@ package org.springframework.data.mapping; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; -import java.util.ArrayList; import java.util.Iterator; -import java.util.List; import java.util.Map; import java.util.Set; import org.junit.Test; -import org.springframework.data.mapping.PropertyPath; /** * Unit tests for {@link PropertyPath}. @@ -169,6 +166,45 @@ public class PropertyUnitTests { assertThat(iterator.hasNext(), is(false)); } + /** + * @see DATACMNS-139 + */ + @Test + public void rejectsInvalidPropertyWithLeadingUnderscore() { + try { + PropertyPath.from("_id", Foo.class); + fail(); + } catch (IllegalArgumentException e) { + assertThat(e.getMessage(), containsString("property _id")); + } + } + + /** + * @see DATACMNS-139 + */ + @Test + public void rejectsNestedInvalidPropertyWithLeadingUnderscore() { + try { + PropertyPath.from("_foo_id", Sample2.class); + fail(); + } catch (IllegalArgumentException e) { + assertThat(e.getMessage(), containsString("property id")); + } + } + + /** + * @see DATACMNS-139 + */ + @Test + public void rejectsNestedInvalidPropertyExplictlySplitWithLeadingUnderscore() { + try { + PropertyPath.from("_foo__id", Sample2.class); + fail(); + } catch (IllegalArgumentException e) { + assertThat(e.getMessage(), containsString("property _id")); + } + } + private class Foo { String userName;