Skip to content

Commit 7b9d807

Browse files
author
Liudmila Molkova
authored
Validate CorrelationContext size and skip everything after 1024 chars (#36)
1 parent 55b1fe8 commit 7b9d807

File tree

2 files changed

+64
-0
lines changed

2 files changed

+64
-0
lines changed

src/Microsoft.AspNet.TelemetryCorrelation/ActivityExtensions.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ public static class ActivityExtensions
2525
/// </summary>
2626
internal const string CorrelationContextHeaderName = "Correlation-Context";
2727

28+
/// <summary>
29+
/// Maximum length of Correlation-Context herader value.
30+
/// </summary>
31+
internal const int MaxCorrelationContextLength = 1024;
32+
2833
/// <summary>
2934
/// Reads Request-Id and Correlation-Context headers and sets ParentId and Baggage on Activity.
3035
/// </summary>
@@ -61,11 +66,24 @@ public static bool Extract(this Activity activity, NameValueCollection requestHe
6166
var baggages = requestHeaders.GetValues(CorrelationContextHeaderName);
6267
if (baggages != null)
6368
{
69+
int correlationContextLength = -1;
6470
// there may be several Correlation-Context header
6571
foreach (var item in baggages)
6672
{
73+
if (correlationContextLength >= MaxCorrelationContextLength)
74+
{
75+
break;
76+
}
77+
6778
foreach (var pair in item.Split(','))
6879
{
80+
correlationContextLength += pair.Length + 1; // pair and comma
81+
82+
if (correlationContextLength >= MaxCorrelationContextLength)
83+
{
84+
break;
85+
}
86+
6987
if (NameValueHeaderValue.TryParse(pair, out NameValueHeaderValue baggageItem))
7088
{
7189
activity.AddBaggage(baggageItem.Name, baggageItem.Value);

test/Microsoft.AspNet.TelemetryCorrelation.Tests/ActivityExtensionsTest.cs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,5 +130,51 @@ public void Can_Restore_Baggages_When_Some_MalFormat_CorrelationContext_In_Heade
130130
var actualBaggage = activity.Baggage.OrderBy(kvp => kvp.Key);
131131
Assert.Equal(expectedBaggage, actualBaggage);
132132
}
133+
134+
[Theory]
135+
[InlineData("key0=value0,key1=value1,key2=value2,key3=value3,key4=value4,key5=value5,key6=value6,key7=value7,key8=value8,key9=value9," +
136+
"key10=value10,key11=value11,key12=value12,key13=value13,key14=value14,key15=value15,key16=value16,key17=value17,key18=value18,key19=value19," +
137+
"key20=value20,key21=value21,key22=value22,key23=value23,key24=value24,key25=value25,key26=value26,key27=value27,key28=value28,key29=value29," +
138+
"key30=value30,key31=value31,key32=value32,key33=value33,key34=value34,key35=value35,key36=value36,key37=value37,key38=value38,key39=value39," +
139+
"key40=value40,key41=value41,key42=value42,key43=value43,key44=value44,key45=value45,key46=value46,key47=value47,key48=value48,key49=value49," +
140+
"key50=value50,key51=value51,key52=value52,key53=value53,key54=value54,key55=value55,key56=value56,key57=value57,key58=value58,key59=value59," +
141+
"key60=value60,key61=value61,key62=value62,key63=value63,key64=value64,key65=value65,key66=value66,key67=value67,key68=value68,key69=value69," +
142+
"key70=value70,key71=value71,key72=value72,key73=value73,k100=vx", 1023)] //1023 chars
143+
[InlineData("key0=value0,key1=value1,key2=value2,key3=value3,key4=value4,key5=value5,key6=value6,key7=value7,key8=value8,key9=value9," +
144+
"key10=value10,key11=value11,key12=value12,key13=value13,key14=value14,key15=value15,key16=value16,key17=value17,key18=value18,key19=value19," +
145+
"key20=value20,key21=value21,key22=value22,key23=value23,key24=value24,key25=value25,key26=value26,key27=value27,key28=value28,key29=value29," +
146+
"key30=value30,key31=value31,key32=value32,key33=value33,key34=value34,key35=value35,key36=value36,key37=value37,key38=value38,key39=value39," +
147+
"key40=value40,key41=value41,key42=value42,key43=value43,key44=value44,key45=value45,key46=value46,key47=value47,key48=value48,key49=value49," +
148+
"key50=value50,key51=value51,key52=value52,key53=value53,key54=value54,key55=value55,key56=value56,key57=value57,key58=value58,key59=value59," +
149+
"key60=value60,key61=value61,key62=value62,key63=value63,key64=value64,key65=value65,key66=value66,key67=value67,key68=value68,key69=value69," +
150+
"key70=value70,key71=value71,key72=value72,key73=value73,k100=vx1", 1024)] //1024 chars
151+
[InlineData("key0=value0,key1=value1,key2=value2,key3=value3,key4=value4,key5=value5,key6=value6,key7=value7,key8=value8,key9=value9," +
152+
"key10=value10,key11=value11,key12=value12,key13=value13,key14=value14,key15=value15,key16=value16,key17=value17,key18=value18,key19=value19," +
153+
"key20=value20,key21=value21,key22=value22,key23=value23,key24=value24,key25=value25,key26=value26,key27=value27,key28=value28,key29=value29," +
154+
"key30=value30,key31=value31,key32=value32,key33=value33,key34=value34,key35=value35,key36=value36,key37=value37,key38=value38,key39=value39," +
155+
"key40=value40,key41=value41,key42=value42,key43=value43,key44=value44,key45=value45,key46=value46,key47=value47,key48=value48,key49=value49," +
156+
"key50=value50,key51=value51,key52=value52,key53=value53,key54=value54,key55=value55,key56=value56,key57=value57,key58=value58,key59=value59," +
157+
"key60=value60,key61=value61,key62=value62,key63=value63,key64=value64,key65=value65,key66=value66,key67=value67,key68=value68,key69=value69," +
158+
"key70=value70,key71=value71,key72=value72,key73=value73,key74=value74", 1029)] //more than 1024 chars
159+
public void Validates_Correlation_Context_Length(string correlationContext, int expectedLength)
160+
{
161+
var activity = new Activity(TestActivityName);
162+
var requestHeaders = new NameValueCollection
163+
{
164+
{ ActivityExtensions.RequestIDHeaderName, "|abc.1" },
165+
{ ActivityExtensions.CorrelationContextHeaderName, correlationContext }
166+
};
167+
Assert.True(activity.Extract(requestHeaders));
168+
169+
var baggageItems = Enumerable.Range(0, 74).Select(i => new KeyValuePair<string, string>("key" + i, "value" + i)).ToList();
170+
if (expectedLength < 1024)
171+
{
172+
baggageItems.Add(new KeyValuePair<string, string>("k100", "vx"));
173+
}
174+
175+
var expectedBaggage = baggageItems.OrderBy(kvp => kvp.Key);
176+
var actualBaggage = activity.Baggage.OrderBy(kvp => kvp.Key);
177+
Assert.Equal(expectedBaggage, actualBaggage);
178+
}
133179
}
134180
}

0 commit comments

Comments
 (0)