diff --git a/deps/v8/src/log.cc b/deps/v8/src/log.cc index 8f47e81f0eccce..d5842597cf9404 100644 --- a/deps/v8/src/log.cc +++ b/deps/v8/src/log.cc @@ -125,8 +125,9 @@ class CodeEventLogger::NameBuffer { } void AppendInt(int n) { - Vector buffer(utf8_buffer_ + utf8_pos_, - kUtf8BufferSize - utf8_pos_); + int space = kUtf8BufferSize - utf8_pos_; + if (space <= 0) return; + Vector buffer(utf8_buffer_ + utf8_pos_, space); int size = SNPrintF(buffer, "%d", n); if (size > 0 && utf8_pos_ + size <= kUtf8BufferSize) { utf8_pos_ += size; @@ -134,8 +135,9 @@ class CodeEventLogger::NameBuffer { } void AppendHex(uint32_t n) { - Vector buffer(utf8_buffer_ + utf8_pos_, - kUtf8BufferSize - utf8_pos_); + int space = kUtf8BufferSize - utf8_pos_; + if (space <= 0) return; + Vector buffer(utf8_buffer_ + utf8_pos_, space); int size = SNPrintF(buffer, "%x", n); if (size > 0 && utf8_pos_ + size <= kUtf8BufferSize) { utf8_pos_ += size; @@ -147,7 +149,7 @@ class CodeEventLogger::NameBuffer { private: static const int kUtf8BufferSize = 512; - static const int kUtf16BufferSize = 128; + static const int kUtf16BufferSize = kUtf8BufferSize; int utf8_pos_; char utf8_buffer_[kUtf8BufferSize]; diff --git a/deps/v8/test/cctest/test-log.cc b/deps/v8/test/cctest/test-log.cc index 0938a9ede21053..daf2e688b6541d 100644 --- a/deps/v8/test/cctest/test-log.cc +++ b/deps/v8/test/cctest/test-log.cc @@ -531,3 +531,58 @@ TEST(LogVersion) { } isolate->Dispose(); } + + +// https://crbug.com/539892 +// CodeCreateEvents with really large names should not crash. +TEST(Issue539892) { + class : public i::CodeEventLogger { + public: + virtual void CodeMoveEvent(Address from, Address to) {} + virtual void CodeDeleteEvent(Address from) {} + virtual void CodeDisableOptEvent(i::Code* code, + i::SharedFunctionInfo* shared) {} + + private: + virtual void LogRecordedBuffer(i::Code* code, i::SharedFunctionInfo* shared, + const char* name, int length) {} + } code_event_logger; + SETUP_FLAGS(); + v8::Isolate::CreateParams create_params; + create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); + v8::Isolate* isolate = v8::Isolate::New(create_params); + + { + ScopedLoggerInitializer initialize_logger(saved_log, saved_prof, isolate); + Logger* logger = initialize_logger.logger(); + logger->addCodeEventListener(&code_event_logger); + + // Function with a really large name. + const char* source_text = + "(function " + "baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac" + "(){})();"; + + CompileRun(source_text); + + // Must not crash. + logger->LogCompiledFunctions(); + } + isolate->Dispose(); +}