Skip to content

Commit a22b527

Browse files
authored
Limit timestamp string length (#4382)
* Limit timestamp string length * Add test
1 parent 712ce7b commit a22b527

File tree

2 files changed

+22
-0
lines changed

2 files changed

+22
-0
lines changed

utils/src/main/java/software/amazon/awssdk/utils/DateUtils.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,8 @@ public static Instant parseUnixTimestampInstant(String dateString) throws Number
200200
if (dateString == null) {
201201
return null;
202202
}
203+
204+
validateTimestampLength(dateString);
203205
BigDecimal dateValue = new BigDecimal(dateString);
204206
return Instant.ofEpochMilli(dateValue.scaleByPowerOfTen(MILLI_SECOND_PRECISION).longValue());
205207
}
@@ -225,4 +227,13 @@ public static String formatUnixTimestampInstant(Instant instant) {
225227
return dateValue.scaleByPowerOfTen(0 - MILLI_SECOND_PRECISION)
226228
.toPlainString();
227229
}
230+
231+
private static void validateTimestampLength(String timestamp) {
232+
// Helps avoid BigDecimal parsing unnecessarily large numbers, since it's unbounded
233+
// Long has a max value of 9,223,372,036,854,775,807, which is 19 digits. Assume that a valid timestamp is no
234+
// no longer than 20 characters long (+1 for decimal)
235+
if (timestamp.length() > 20) {
236+
throw new RuntimeException("Input timestamp string must be no longer than 20 characters");
237+
}
238+
}
228239
}

utils/src/test/java/software/amazon/awssdk/utils/DateUtilsTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static java.time.format.DateTimeFormatter.ISO_OFFSET_DATE_TIME;
2121
import static java.time.format.DateTimeFormatter.RFC_1123_DATE_TIME;
2222
import static org.assertj.core.api.Assertions.assertThat;
23+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
2324
import static org.junit.Assert.assertEquals;
2425
import static org.junit.Assert.assertTrue;
2526
import static software.amazon.awssdk.utils.DateUtils.ALTERNATE_ISO_8601_DATE_FORMAT;
@@ -39,6 +40,8 @@
3940
import java.util.Locale;
4041
import java.util.TimeZone;
4142
import java.util.concurrent.TimeUnit;
43+
import java.util.stream.Collectors;
44+
import java.util.stream.Stream;
4245
import org.junit.Test;
4346

4447
public class DateUtilsTest {
@@ -295,4 +298,12 @@ public void testUnixTimestampRoundtrip() throws Exception {
295298
});
296299
}
297300

301+
@Test
302+
public void parseUnixTimestampInstant_longerThan20Char_throws() {
303+
String largeNum = Stream.generate(() -> "9").limit(21).collect(Collectors.joining());
304+
assertThatThrownBy(() -> DateUtils.parseUnixTimestampInstant(largeNum))
305+
.isInstanceOf(RuntimeException.class)
306+
.hasMessageContaining("20");
307+
}
308+
298309
}

0 commit comments

Comments
 (0)