Browse Source

CronSequenceGenerator prevents stack overflow in case of inverted range

Issue: SPR-14462
pull/1111/head
Juergen Hoeller 8 years ago
parent
commit
e431624e84
  1. 6
      spring-context/src/main/java/org/springframework/scheduling/support/CronSequenceGenerator.java
  2. 20
      spring-context/src/test/java/org/springframework/scheduling/support/CronSequenceGeneratorTests.java

6
spring-context/src/main/java/org/springframework/scheduling/support/CronSequenceGenerator.java

@ -95,6 +95,7 @@ public class CronSequenceGenerator { @@ -95,6 +95,7 @@ public class CronSequenceGenerator {
parse(expression);
}
/**
* Return the cron pattern that this sequence generator has been built for.
*/
@ -378,6 +379,10 @@ public class CronSequenceGenerator { @@ -378,6 +379,10 @@ public class CronSequenceGenerator {
throw new IllegalArgumentException("Range less than minimum (" + min + "): '" +
field + "' in expression \"" + this.expression + "\"");
}
if (result[0] > result[1]) {
throw new IllegalArgumentException("Invalid inverted range: '" + field +
"' in expression \"" + this.expression + "\"");
}
return result;
}
@ -388,6 +393,7 @@ public class CronSequenceGenerator { @@ -388,6 +393,7 @@ public class CronSequenceGenerator {
* fields separated by single spaces.
* @param expression the expression to evaluate
* @return {@code true} if the given expression is a valid cron expression
* @since 4.3
*/
public static boolean isValidExpression(String expression) {
String[] fields = StringUtils.tokenizeToStringArray(expression, " ");

20
spring-context/src/test/java/org/springframework/scheduling/support/CronSequenceGeneratorTests.java

@ -56,6 +56,26 @@ public class CronSequenceGeneratorTests { @@ -56,6 +56,26 @@ public class CronSequenceGeneratorTests {
new CronSequenceGenerator("*/-1 * * * * *").next(new Date(2012, 6, 1, 9, 0));
}
@Test(expected = IllegalArgumentException.class)
public void withInvertedMinuteRange() {
new CronSequenceGenerator("* 6-5 * * * *").next(new Date(2012, 6, 1, 9, 0));
}
@Test(expected = IllegalArgumentException.class)
public void withInvertedHourRange() {
new CronSequenceGenerator("* * 6-5 * * *").next(new Date(2012, 6, 1, 9, 0));
}
@Test
public void withSameMinuteRange() {
new CronSequenceGenerator("* 6-6 * * * *").next(new Date(2012, 6, 1, 9, 0));
}
@Test
public void withSameHourRange() {
new CronSequenceGenerator("* * 6-6 * * *").next(new Date(2012, 6, 1, 9, 0));
}
@Test
public void validExpression() {
assertTrue(CronSequenceGenerator.isValidExpression("0 */2 1-4 * * *"));

Loading…
Cancel
Save