From b4e32f3b33eb1d43d81b01e6f5f0815ced3f5e5b Mon Sep 17 00:00:00 2001 From: Andreas Gampe Date: Tue, 4 Oct 2016 19:17:07 -0700 Subject: [PATCH] Base: Hand complete log message to aborter Undo zero-termination-substitution for linebreaks when logging. This results in handing the complete log message to the aborter. Add a test. Bug: 31893081 Test: mmma system/core/base && $ANDROID_HOST_OUT/nativetest64/libbase_test/libbase_test64 Change-Id: I2ef6c6351db2fd494a02985f634f439104136227 --- base/logging.cpp | 2 ++ base/logging_test.cpp | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/base/logging.cpp b/base/logging.cpp index ece10ecdd..dab86fe89 100644 --- a/base/logging.cpp +++ b/base/logging.cpp @@ -415,6 +415,8 @@ LogMessage::~LogMessage() { msg[nl] = '\0'; LogLine(data_->GetFile(), data_->GetLineNumber(), data_->GetId(), data_->GetSeverity(), &msg[i]); + // Undo the zero-termination so we can give the complete message to the aborter. + msg[nl] = '\n'; i = nl + 1; } } diff --git a/base/logging_test.cpp b/base/logging_test.cpp index 9fc77368f..1ee181a42 100644 --- a/base/logging_test.cpp +++ b/base/logging_test.cpp @@ -606,3 +606,27 @@ TEST(logging, LOG_FATAL_NOOP_ABORTER) { ASSERT_DEATH({SuppressAbortUI(); LOG(FATAL) << "foobar";}, "foobar"); } + +struct CountLineAborter { + static void CountLineAborterFunction(const char* msg) { + while (*msg != 0) { + if (*msg == '\n') { + newline_count++; + } + msg++; + } + } + static size_t newline_count; +}; +size_t CountLineAborter::newline_count = 0; + +TEST(logging, LOG_FATAL_ABORTER_MESSAGE) { + CountLineAborter::newline_count = 0; + android::base::SetAborter(CountLineAborter::CountLineAborterFunction); + + android::base::ScopedLogSeverity sls(android::base::ERROR); + CapturedStderr cap; + LOG(FATAL) << "foo\nbar"; + + EXPECT_EQ(CountLineAborter::newline_count, 1U + 1U); // +1 for final '\n'. +}