Skip to content

Commit 46ec13f

Browse files
committed
Reject the locale infinity symbol in DoubleValidator and FloatValidator
1 parent cc67308 commit 46ec13f

4 files changed

Lines changed: 42 additions & 1 deletion

File tree

src/main/java/org/apache/commons/validator/routines/DoubleValidator.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,10 +193,16 @@ public boolean minValue(final Double value, final double min) {
193193
*/
194194
@Override
195195
protected Object processParsedValue(final Object value, final Format formatter) {
196+
final double doubleValue = ((Number) value).doubleValue();
197+
// The "Infinity"/"-Infinity" strings throw a ParseException, but the locale infinity
198+
// symbol parses through to an infinite value; reject it so the two paths are consistent.
199+
if (Double.isInfinite(doubleValue)) {
200+
return null;
201+
}
196202
if (value instanceof Double) {
197203
return value;
198204
}
199-
return Double.valueOf(((Number) value).doubleValue());
205+
return Double.valueOf(doubleValue);
200206

201207
}
202208

src/main/java/org/apache/commons/validator/routines/FloatValidator.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,11 @@ protected Object processParsedValue(final Object value, final Format formatter)
197197

198198
final double doubleValue = ((Number) value).doubleValue();
199199

200+
// The "Infinity"/"-Infinity" strings throw a ParseException, but the locale infinity
201+
// symbol parses through to an infinite value; reject it so the two paths are consistent.
202+
if (Double.isInfinite(doubleValue)) {
203+
return null;
204+
}
200205
if (doubleValue > 0) {
201206
if (doubleValue < Float.MIN_VALUE || doubleValue > Float.MAX_VALUE) {
202207
return null;

src/test/java/org/apache/commons/validator/routines/DoubleValidatorTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import static org.junit.jupiter.api.Assertions.assertNull;
2323
import static org.junit.jupiter.api.Assertions.assertTrue;
2424

25+
import java.text.DecimalFormatSymbols;
2526
import java.util.Locale;
2627

2728
import org.junit.jupiter.api.BeforeEach;
@@ -167,6 +168,20 @@ void testDoubleValidateSpecialValuesJava8() {
167168
assertFalse(validator.isValid(Double.toString(Double.NEGATIVE_INFINITY)));
168169
}
169170

171+
/**
172+
* Test the locale infinity symbol is rejected. Unlike the "Infinity" string, the symbol parses through to an infinite value, so it is rejected to keep both
173+
* paths consistent. NaN is unaffected.
174+
*/
175+
@Test
176+
void testDoubleValidateInfinitySymbol() {
177+
final DoubleValidator validator = DoubleValidator.getInstance();
178+
final String infinity = new DecimalFormatSymbols(Locale.US).getInfinity();
179+
assertNull(validator.validate(infinity, Locale.US), "validate(infinity symbol)");
180+
assertNull(validator.validate("-" + infinity, Locale.US), "validate(-infinity symbol)");
181+
assertFalse(validator.isValid(infinity, Locale.US), "isValid(infinity symbol)");
182+
assertFalse(validator.isValid("-" + infinity, Locale.US), "isValid(-infinity symbol)");
183+
}
184+
170185
/**
171186
* Test DoubleValidator validate Methods
172187
*/

src/test/java/org/apache/commons/validator/routines/FloatValidatorTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import static org.junit.jupiter.api.Assertions.assertTrue;
2424

2525
import java.text.DecimalFormat;
26+
import java.text.DecimalFormatSymbols;
2627
import java.util.Locale;
2728

2829
import org.junit.jupiter.api.BeforeEach;
@@ -150,6 +151,20 @@ void testFloatSmallestValues() {
150151
assertFalse(FloatValidator.getInstance().isValid(strTooSmallNegative, pattern), "Too small -ve");
151152
}
152153

154+
/**
155+
* Test the locale infinity symbol is rejected. Unlike the "Infinity" string, the symbol parses through to an infinite value, so it is rejected to keep both
156+
* paths consistent. NaN is unaffected.
157+
*/
158+
@Test
159+
void testFloatValidateInfinitySymbol() {
160+
final FloatValidator validator = FloatValidator.getInstance();
161+
final String infinity = new DecimalFormatSymbols(Locale.US).getInfinity();
162+
assertNull(validator.validate(infinity, Locale.US), "validate(infinity symbol)");
163+
assertNull(validator.validate("-" + infinity, Locale.US), "validate(-infinity symbol)");
164+
assertFalse(validator.isValid(infinity, Locale.US), "isValid(infinity symbol)");
165+
assertFalse(validator.isValid("-" + infinity, Locale.US), "isValid(-infinity symbol)");
166+
}
167+
153168
/**
154169
* Test FloatValidator validate Methods
155170
*/

0 commit comments

Comments
 (0)