diff --git a/httpcore5/src/main/java/org/apache/hc/core5/util/Deadline.java b/httpcore5/src/main/java/org/apache/hc/core5/util/Deadline.java index 8d5b70c7b..630cc040b 100644 --- a/httpcore5/src/main/java/org/apache/hc/core5/util/Deadline.java +++ b/httpcore5/src/main/java/org/apache/hc/core5/util/Deadline.java @@ -83,8 +83,11 @@ public class Deadline { */ public static Deadline calculate(final long timeMillis, final TimeValue timeValue) { if (TimeValue.isPositive(timeValue)) { - // TODO handle unlikely overflow - final long deadline = timeMillis + timeValue.toMilliseconds(); + final long timeToAdd = timeValue.toMilliseconds(); + if (timeToAdd > 0 && timeMillis > Long.MAX_VALUE - timeToAdd) { + return Deadline.MAX_VALUE; // Overflow detected + } + final long deadline = timeMillis + timeToAdd; return deadline < 0 ? Deadline.MAX_VALUE : Deadline.fromUnixMilliseconds(deadline); } return Deadline.MAX_VALUE; diff --git a/httpcore5/src/test/java/org/apache/hc/core5/util/TestDeadline.java b/httpcore5/src/test/java/org/apache/hc/core5/util/TestDeadline.java index 9677ad107..d4e6b4784 100644 --- a/httpcore5/src/test/java/org/apache/hc/core5/util/TestDeadline.java +++ b/httpcore5/src/test/java/org/apache/hc/core5/util/TestDeadline.java @@ -130,4 +130,14 @@ void testValue() { final Deadline deadline = Deadline.fromUnixMilliseconds(nowPlusOneMin); Assertions.assertEquals(nowPlusOneMin, deadline.getValue()); } + + @Test + void testOverflowHandling() { + final long currentTime = Long.MAX_VALUE - 5000; // Simulate close to overflow + final TimeValue tenSeconds = TimeValue.ofMilliseconds(10000); // 10 seconds + final Deadline deadline = Deadline.calculate(currentTime, tenSeconds); + + Assertions.assertEquals(Deadline.MAX_VALUE, deadline, + "Overflow should result in the maximum deadline value."); + } }