Fix Dart_GlobalTimelineGetTrace to null terminate the string

BUG=
R=rmacnak@google.com

Review URL: https://codereview.chromium.org/1412193007 .
This commit is contained in:
John McCutchan
2015-10-20 13:22:07 -07:00
parent 1a75281742
commit d87c759560
2 changed files with 49 additions and 1 deletions
+14 -1
View File
@@ -5806,13 +5806,26 @@ static bool StreamTraceEvents(Dart_StreamConsumer consumer,
char* output = NULL;
intptr_t output_length = 0;
js->Steal(const_cast<const char**>(&output), &output_length);
if (output_length < 3) {
// Empty JSON array.
free(output);
return false;
}
// We want to send the JSON array without the leading '[' or trailing ']'
// characters.
ASSERT(output[0] == '[');
ASSERT(output[output_length - 1] == ']');
// Replace the ']' with the null character.
output[output_length - 1] = '\0';
// We are skipping the '['.
output_length -= 1;
// Start the stream.
StartStreamToConsumer(consumer, user_data, "timeline");
DataStreamToConsumer(consumer,
user_data,
output,
&output[1],
output_length,
"timeline");
+35
View File
@@ -9562,6 +9562,12 @@ TEST_CASE(Timeline_Dart_TimelineGetTrace) {
EXPECT(buffer_length > 0);
EXPECT(buffer != NULL);
// Response starts with a '{' character and not a '['.
EXPECT(buffer[0] == '{');
// Response ends with a '}' character and not a ']'.
EXPECT(buffer[buffer_length - 1] == '\0');
EXPECT(buffer[buffer_length - 2] == '}');
// Heartbeat test.
EXPECT_SUBSTRING("\"cat\":\"Compiler\"", buffer);
EXPECT_SUBSTRING("\"name\":\"CompileFunction\"", buffer);
@@ -9609,6 +9615,12 @@ TEST_CASE(Timeline_Dart_TimelineGetTraceOnlyDartEvents) {
EXPECT(buffer_length > 0);
EXPECT(buffer != NULL);
// Response starts with a '{' character and not a '['.
EXPECT(buffer[0] == '{');
// Response ends with a '}' character and not a ']'.
EXPECT(buffer[buffer_length - 1] == '\0');
EXPECT(buffer[buffer_length - 2] == '}');
// Heartbeat test.
EXPECT_SUBSTRING("\"cat\":\"Dart\"", buffer);
EXPECT_SUBSTRING("\"name\":\"DART_NAME\"", buffer);
@@ -9654,6 +9666,12 @@ TEST_CASE(Timeline_Dart_TimelineGetTraceWithDartEvents) {
EXPECT(buffer_length > 0);
EXPECT(buffer != NULL);
// Response starts with a '{' character and not a '['.
EXPECT(buffer[0] == '{');
// Response ends with a '}' character and not a ']'.
EXPECT(buffer[buffer_length - 1] == '\0');
EXPECT(buffer[buffer_length - 2] == '}');
// Heartbeat test.
EXPECT_SUBSTRING("\"cat\":\"Compiler\"", buffer);
EXPECT_SUBSTRING("\"name\":\"CompileFunction\"", buffer);
@@ -9697,6 +9715,12 @@ TEST_CASE(Timeline_Dart_TimelineGetTraceGlobalOverride) {
EXPECT(buffer_length > 0);
EXPECT(buffer != NULL);
// Response starts with a '{' character and not a '['.
EXPECT(buffer[0] == '{');
// Response ends with a '}' character and not a ']'.
EXPECT(buffer[buffer_length - 1] == '\0');
EXPECT(buffer[buffer_length - 2] == '}');
// Heartbeat test.
EXPECT_SUBSTRING("\"cat\":\"Compiler\"", buffer);
EXPECT_SUBSTRING("\"name\":\"CompileFunction\"", buffer);
@@ -9745,6 +9769,12 @@ TEST_CASE(Timeline_Dart_GlobalTimelineGetTrace) {
EXPECT(buffer_length > 0);
EXPECT(buffer != NULL);
// Response starts with a '{' character and not a '['.
EXPECT(buffer[0] == '{');
// Response ends with a '}' character and not a ']'.
EXPECT(buffer[buffer_length - 1] == '\0');
EXPECT(buffer[buffer_length - 2] == '}');
// Heartbeat test.
EXPECT_SUBSTRING("\"name\":\"TestVMDuration\"", buffer);
EXPECT_SUBSTRING("\"cat\":\"Compiler\"", buffer);
@@ -9779,6 +9809,11 @@ TEST_CASE(Timeline_Dart_GlobalTimelineGetTrace) {
buffer_length = data.buffer_length;
EXPECT(buffer_length > 0);
EXPECT(buffer != NULL);
// Response starts with a '{' character and not a '['.
EXPECT(buffer[0] == '{');
// Response ends with a '}' character and not a ']'.
EXPECT(buffer[buffer_length - 1] == '\0');
EXPECT(buffer[buffer_length - 2] == '}');
// Heartbeat test for old events.
EXPECT_SUBSTRING("\"name\":\"TestVMDuration\"", buffer);