Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/main/java/org/pageseeder/furi/Variable.java
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ public enum Modifier {
* sequence. This pattern contains non-capturing parentheses to make it easier to get variable
* values as a group.
*/
protected static final Pattern VALID_VALUE = Pattern.compile("(?:[\\w.~-]|(?:%[0-9A-F]{2}))+");
protected static final Pattern VALID_VALUE = Pattern.compile("(?>[\\w.~-]|(?>%[0-9A-F]{2}))+");

/**
* The default value is an empty string.
Expand Down
34 changes: 33 additions & 1 deletion src/test/java/org/pageseeder/furi/VariableTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
package org.pageseeder.furi;

import java.util.Arrays;
import java.util.Random;
import java.util.stream.IntStream;

import org.pageseeder.furi.Variable.Form;

Expand Down Expand Up @@ -66,7 +68,7 @@ public void testNew_Default() {
Variable var = new Variable("name", null);
assertEquals("", var.defaultValue());
assertEquals(null, var.type());
// default value unspecified
// default value unspecified
var = new Variable("name");
assertEquals("", var.defaultValue());
assertEquals(null, var.type());
Expand Down Expand Up @@ -211,6 +213,36 @@ public void testValues() {
assertArrayEquals(new String[] { "m", "", "n" }, new Variable("e", "x").values(params));
}

/**
* Test long values (>~3500) do not cause StackOverflow exception
*/
public void testIsValidValue_noStackOverflowErrorWithLargeValue() {
Random random = new Random();

StringBuilder valueBuilder = new StringBuilder();
IntStream.range(0, 3500).forEach(i -> valueBuilder.append(random.nextInt(9)));

boolean valid = Variable.isValidValue(valueBuilder.toString());
assertTrue(valid);
}

public void testIsValidValue_invalidValueFails() {
// Invalid encoding, "G" not in [0-9A-F]
String invalidEncoding1 = "12345%3G";
boolean invalidEncodingValid1 = Variable.isValidValue(invalidEncoding1);
assertFalse(invalidEncodingValid1);

// Invalid encoding, two of [0-9A-F] must follow "%"
String invalidEncoding2 = "12345%3";
boolean invalidEncoding2Valid = Variable.isValidValue(invalidEncoding2);
assertFalse(invalidEncoding2Valid);

// Invalid character, ":" not in [/w.~-]
String invalidCharacter = "1234:%2C";
boolean invalidCharacterValid = Variable.isValidValue(invalidCharacter);
assertFalse(invalidCharacterValid);
}

// private helpers
// --------------------------------------------------------------------------

Expand Down