From fd5c61742090834da464dae5c2307cc8b86ba199 Mon Sep 17 00:00:00 2001 From: Arturo Bernal Date: Fri, 10 Jan 2025 16:52:36 +0100 Subject: [PATCH] Handle overflow in Deadline calculation to ensure correct behavior for large time values. (#512) --- .../main/java/org/apache/hc/core5/util/Deadline.java | 5 ++--- .../java/org/apache/hc/core5/util/TestDeadline.java | 10 ++++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) 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..29c493f06 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,9 +83,8 @@ 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(); - return deadline < 0 ? Deadline.MAX_VALUE : Deadline.fromUnixMilliseconds(deadline); + return Deadline.fromUnixMilliseconds(timeMillis + + Math.min(timeValue.toMilliseconds(), Long.MAX_VALUE - timeMillis)); } 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."); + } }