Skip to content
This repository has been archived by the owner on Jan 23, 2023. It is now read-only.

Support large EventSource filter args #27500

Merged
merged 1 commit into from
Oct 29, 2019
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -294,19 +294,22 @@ private unsafe void EtwEnableCallBack(
GetDataFromController(etwSessionId, filterData, out command, out data, out keyIndex))
{
args = new Dictionary<string, string?>(4);
Debug.Assert(data != null);
while (keyIndex < data.Length)
// data can be null if the filterArgs had a very large size which failed our sanity check
if (data != null)
{
int keyEnd = FindNull(data, keyIndex);
int valueIdx = keyEnd + 1;
int valueEnd = FindNull(data, valueIdx);
if (valueEnd < data.Length)
while (keyIndex < data.Length)
{
string key = System.Text.Encoding.UTF8.GetString(data, keyIndex, keyEnd - keyIndex);
string value = System.Text.Encoding.UTF8.GetString(data, valueIdx, valueEnd - valueIdx);
args[key] = value;
int keyEnd = FindNull(data, keyIndex);
int valueIdx = keyEnd + 1;
int valueEnd = FindNull(data, valueIdx);
if (valueEnd < data.Length)
{
string key = System.Text.Encoding.UTF8.GetString(data, keyIndex, keyEnd - keyIndex);
string value = System.Text.Encoding.UTF8.GetString(data, valueIdx, valueEnd - valueIdx);
args[key] = value;
}
keyIndex = valueEnd + 1;
}
keyIndex = valueEnd + 1;
}
}

Expand Down Expand Up @@ -619,7 +622,10 @@ private unsafe bool GetDataFromController(int etwSessionId,
}
else
{
if (filterData->Ptr != 0 && 0 < filterData->Size && filterData->Size <= 1024)
// ETW limited filter data to 1024 bytes but EventPipe doesn't. DiagnosticSourceEventSource
// can legitimately use large filter data buffers to encode a large set of events and properties
// that should be gathered so I am bumping the limit from 1K -> 100K.
if (filterData->Ptr != 0 && 0 < filterData->Size && filterData->Size <= 100*1024)
{
data = new byte[filterData->Size];
Marshal.Copy((IntPtr)filterData->Ptr, data, 0, data.Length);
Expand Down