diff options
author | Johannes Dahlström <johannesd@vaadin.com> | 2013-08-01 11:53:34 +0300 |
---|---|---|
committer | Vaadin Code Review <review@vaadin.com> | 2013-08-01 10:33:37 +0000 |
commit | 7fc105440755357d469d87b9523afc6f84e0bda7 (patch) | |
tree | ec11f2008f6ac2d75605f3353c5ebb6fc305e157 | |
parent | 326bbb5e91564a39553b13f5a3a00b7ff5dd40ec (diff) | |
download | vaadin-framework-7fc105440755357d469d87b9523afc6f84e0bda7.tar.gz vaadin-framework-7fc105440755357d469d87b9523afc6f84e0bda7.zip |
Ensure StringToIntegerConverter rejects values outside range of int (#12230)
Change-Id: I150bee64144045355bfa75ac10ede663d3feb5ce
-rw-r--r-- | server/src/com/vaadin/data/util/converter/StringToIntegerConverter.java | 17 | ||||
-rw-r--r-- | server/tests/src/com/vaadin/tests/data/converter/TestStringToIntegerConverter.java | 18 |
2 files changed, 34 insertions, 1 deletions
diff --git a/server/src/com/vaadin/data/util/converter/StringToIntegerConverter.java b/server/src/com/vaadin/data/util/converter/StringToIntegerConverter.java index bc436112fe..f6f668ad4d 100644 --- a/server/src/com/vaadin/data/util/converter/StringToIntegerConverter.java +++ b/server/src/com/vaadin/data/util/converter/StringToIntegerConverter.java @@ -62,7 +62,22 @@ public class StringToIntegerConverter extends Class<? extends Integer> targetType, Locale locale) throws ConversionException { Number n = convertToNumber(value, targetType, locale); - return n == null ? null : n.intValue(); + + if (n == null) { + return null; + } + + int intValue = n.intValue(); + if (intValue == n.longValue()) { + // If the value of n is outside the range of long, the return value + // of longValue() is either Long.MIN_VALUE or Long.MAX_VALUE. The + // above comparison promotes int to long and thus does not need to + // consider wrap-around. + return intValue; + } + + throw new ConversionException("Could not convert '" + value + "' to " + + Integer.class.getName() + ": value out of range"); } diff --git a/server/tests/src/com/vaadin/tests/data/converter/TestStringToIntegerConverter.java b/server/tests/src/com/vaadin/tests/data/converter/TestStringToIntegerConverter.java index c73853578e..e810106631 100644 --- a/server/tests/src/com/vaadin/tests/data/converter/TestStringToIntegerConverter.java +++ b/server/tests/src/com/vaadin/tests/data/converter/TestStringToIntegerConverter.java @@ -2,6 +2,7 @@ package com.vaadin.tests.data.converter; import junit.framework.TestCase; +import com.vaadin.data.util.converter.Converter.ConversionException; import com.vaadin.data.util.converter.StringToIntegerConverter; public class TestStringToIntegerConverter extends TestCase { @@ -16,6 +17,23 @@ public class TestStringToIntegerConverter extends TestCase { assertEquals(null, converter.convertToModel("", Integer.class, null)); } + public void testValueOutOfRange() { + Double[] values = new Double[] { Integer.MAX_VALUE * 2.0, + Integer.MIN_VALUE * 2.0, Long.MAX_VALUE * 2.0, + Long.MIN_VALUE * 2.0 }; + + boolean accepted = false; + for (Number value : values) { + try { + converter.convertToModel(String.format("%.0f", value), + Integer.class, null); + accepted = true; + } catch (ConversionException expected) { + } + } + assertFalse("Accepted value outside range of int", accepted); + } + public void testValueConversion() { assertEquals(Integer.valueOf(10), converter.convertToModel("10", Integer.class, null)); |