From c512347ef894bea6a2203f6447b93084e264d8c9 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Mon, 19 Oct 2026 13:22:23 +0200 Subject: [PATCH] fix(core): Fix 99999999999999999999 ID parsing 99999999999999999999 is accepted as 7766279631452241919 instead of being rejected --- .../api/internal/util/LongStringUtils.java | 2 +- .../java/datadog/trace/api/DDSpanIdTest.java | 1 + .../java/datadog/trace/api/DDTraceIdTest.java | 1 + .../propagation/DatadogHttpExtractorTest.java | 28 ++++++++++--------- 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/dd-trace-api/src/main/java/datadog/trace/api/internal/util/LongStringUtils.java b/dd-trace-api/src/main/java/datadog/trace/api/internal/util/LongStringUtils.java index 4cf5c652a55..f2196e8dadb 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/internal/util/LongStringUtils.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/internal/util/LongStringUtils.java @@ -111,7 +111,7 @@ public static long parseUnsignedLong(String s) throws NumberFormatException { if (ok < 0) { throw new NumberFormatException("Illegal character in " + s); } - if (first > MAX_FIRST_PART) { + if (Long.compareUnsigned(first, MAX_FIRST_PART) > 0) { throw numberFormatOutOfLongRange(s); } long guard = first * 10; diff --git a/dd-trace-api/src/test/java/datadog/trace/api/DDSpanIdTest.java b/dd-trace-api/src/test/java/datadog/trace/api/DDSpanIdTest.java index 2499173f29f..58915c96aa1 100644 --- a/dd-trace-api/src/test/java/datadog/trace/api/DDSpanIdTest.java +++ b/dd-trace-api/src/test/java/datadog/trace/api/DDSpanIdTest.java @@ -42,6 +42,7 @@ void convertIdsFromToString(String stringId, long expectedId) { "-1", "18446744073709551616", "18446744073709551625", + "99999999999999999999", "184467440737095516150", "18446744073709551a1", "184467440737095511a" diff --git a/dd-trace-api/src/test/java/datadog/trace/api/DDTraceIdTest.java b/dd-trace-api/src/test/java/datadog/trace/api/DDTraceIdTest.java index 98225bb9698..7948fcec142 100644 --- a/dd-trace-api/src/test/java/datadog/trace/api/DDTraceIdTest.java +++ b/dd-trace-api/src/test/java/datadog/trace/api/DDTraceIdTest.java @@ -62,6 +62,7 @@ void convert64BitIdsFromToStringRepresentation(String stringId, DD64bTraceId exp "-1", "18446744073709551616", "18446744073709551625", + "99999999999999999999", "184467440737095516150", "18446744073709551a1", "184467440737095511a" diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpExtractorTest.java index 3eaa1bf5aa1..fb4a5e3bda2 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpExtractorTest.java @@ -260,19 +260,21 @@ void extractHttpHeadersWithOutOfRangeSpanId() { } @TableTest({ - "scenario | traceId | spanId | expectExtraction", - "negative traceId | '-1' | '1' | false ", - "negative spanId | '1' | '-1' | false ", - "zero traceId | '0' | '1' | false ", - "zero spanId | '1' | '0' | true ", - "uint64 max traceId | 'MAX' | '1' | true ", - "out-of-range traceId | 'MAX+1' | '1' | false ", - "uint64 max spanId | '1' | 'MAX' | true ", - "out-of-range spanId | '1' | 'MAX+1' | false ", - "empty traceId | '' | '1' | false ", - "empty spanId | '1' | '' | false ", - "hex traceId | '0x1a' | '1' | false ", - "hex spanId | '1' | '0x1a' | false " + "scenario | traceId | spanId | expectExtraction", + "negative traceId | '-1' | '1' | false ", + "negative spanId | '1' | '-1' | false ", + "zero traceId | '0' | '1' | false ", + "zero spanId | '1' | '0' | true ", + "uint64 max traceId | 'MAX' | '1' | true ", + "out-of-range traceId | 'MAX+1' | '1' | false ", + "wrapping traceId | '99999999999999999999' | '1' | false ", + "uint64 max spanId | '1' | 'MAX' | true ", + "out-of-range spanId | '1' | 'MAX+1' | false ", + "wrapping spanId | '1' | '99999999999999999999' | false ", + "empty traceId | '' | '1' | false ", + "empty spanId | '1' | '' | false ", + "hex traceId | '0x1a' | '1' | false ", + "hex spanId | '1' | '0x1a' | false " }) void moreIdRangeValidation( @ConvertWith(TraceIdConverter.class) String traceId,