@@ -87,6 +87,7 @@ class HttpTraceContext : public context::propagation::TextMapPropagator
8787
8888private:
8989 static constexpr uint8_t kInvalidVersion = 0xFF ;
90+ static constexpr uint8_t kDefaultAssumedVersion = 0x00 ;
9091
9192 static bool IsValidVersion (nostd::string_view version_hex)
9293 {
@@ -95,6 +96,13 @@ class HttpTraceContext : public context::propagation::TextMapPropagator
9596 return version != kInvalidVersion ;
9697 }
9798
99+ static bool IsHigherVersion (nostd::string_view version_hex)
100+ {
101+ uint8_t version;
102+ detail::HexToBinary (version_hex, &version, sizeof (version));
103+ return version > kDefaultAssumedVersion ;
104+ }
105+
98106 static void InjectImpl (context::propagation::TextMapCarrier &carrier,
99107 const SpanContext &span_context)
100108 {
@@ -122,11 +130,6 @@ class HttpTraceContext : public context::propagation::TextMapPropagator
122130 static SpanContext ExtractContextFromTraceHeaders (nostd::string_view trace_parent,
123131 nostd::string_view trace_state)
124132 {
125- if (trace_parent.size () != kTraceParentSize )
126- {
127- return SpanContext::GetInvalid ();
128- }
129-
130133 std::array<nostd::string_view, 4 > fields{};
131134 if (detail::SplitString (trace_parent, ' -' , fields.data (), 4 ) != 4 )
132135 {
@@ -155,6 +158,16 @@ class HttpTraceContext : public context::propagation::TextMapPropagator
155158 return SpanContext::GetInvalid ();
156159 }
157160
161+ if (IsHigherVersion (version_hex) && trace_parent.size () < kTraceParentSize )
162+ {
163+ return SpanContext::GetInvalid ();
164+ }
165+
166+ if (!IsHigherVersion (version_hex) && trace_parent.size () != kTraceParentSize )
167+ {
168+ return SpanContext::GetInvalid ();
169+ }
170+
158171 TraceId trace_id = TraceIdFromHex (trace_id_hex);
159172 SpanId span_id = SpanIdFromHex (span_id_hex);
160173
0 commit comments