8133022: Instant.toEpochMilli() silently overflows
authorrriggs
Thu, 06 Aug 2015 14:35:04 -0400
changeset 32041 a7acd5afbd27
parent 32040 60bfa2d7fbd5
child 32042 67cb76150baa
8133022: Instant.toEpochMilli() silently overflows Reviewed-by: lancea, chegar, simonis, dfuchs, igerasim
jdk/src/java.base/share/classes/java/time/Instant.java
jdk/test/java/time/tck/java/time/TCKInstant.java
--- 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()
     //-----------------------------------------------------------------------