8133022: Instant.toEpochMilli() silently overflows
Reviewed-by: lancea, chegar, simonis, dfuchs, igerasim
--- a/jdk/src/java.base/share/classes/java/time/Instant.java Thu Aug 06 11:19:53 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/time/Instant.java Thu Aug 06 14:35:04 2015 -0400
@@ -1232,10 +1232,10 @@
if (seconds < 0 && nanos > 0) {
long millis = Math.multiplyExact(seconds+1, 1000);
long adjustment = nanos / 1000_000 - 1000;
- return millis + adjustment;
+ return Math.addExact(millis, adjustment);
} else {
long millis = Math.multiplyExact(seconds, 1000);
- return millis + nanos / 1000_000;
+ return Math.addExact(millis, nanos / 1000_000);
}
}
--- a/jdk/test/java/time/tck/java/time/TCKInstant.java Thu Aug 06 11:19:53 2015 -0700
+++ b/jdk/test/java/time/tck/java/time/TCKInstant.java Thu Aug 06 14:35:04 2015 -0400
@@ -112,6 +112,8 @@
/**
* Test Instant.
+ *
+ * @bug 8133022
*/
@Test
public class TCKInstant extends AbstractDateTimeTest {
@@ -1928,6 +1930,16 @@
Instant.ofEpochSecond(Long.MIN_VALUE / 1000 - 1).toEpochMilli();
}
+ @Test(expectedExceptions=ArithmeticException.class)
+ public void test_toEpochMillis_overflow() {
+ Instant.ofEpochSecond(Long.MAX_VALUE / 1000, 809_000_000).toEpochMilli();
+ }
+
+ @Test(expectedExceptions=ArithmeticException.class)
+ public void test_toEpochMillis_overflow2() {
+ Instant.ofEpochSecond(-9223372036854776L, 1).toEpochMilli();
+ }
+
//-----------------------------------------------------------------------
// compareTo()
//-----------------------------------------------------------------------