diff options
-rw-r--r-- | CMakeLists.txt | 10 | ||||
-rw-r--r-- | absl/debugging/internal/stacktrace_x86-inl.inc | 25 | ||||
-rw-r--r-- | absl/status/BUILD.bazel | 1 | ||||
-rw-r--r-- | absl/status/CMakeLists.txt | 1 | ||||
-rw-r--r-- | absl/status/status.cc | 2 | ||||
-rw-r--r-- | absl/status/status.h | 3 | ||||
-rw-r--r-- | absl/strings/internal/cord_internal.h | 2 |
7 files changed, 30 insertions, 14 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 7c8bfff4..d59c2ade 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -160,22 +160,16 @@ if(BUILD_TESTING) if (NOT ABSL_FIND_GOOGLETEST) # When Google Test is included directly rather than through find_package, the aliases are missing. - add_library(GTest::gtest_main ALIAS gtest_main) add_library(GTest::gtest ALIAS gtest) + add_library(GTest::gtest_main ALIAS gtest_main) add_library(GTest::gmock ALIAS gmock) + add_library(GTest::gmock_main ALIAS gmock_main) endif() check_target(GTest::gtest) check_target(GTest::gtest_main) check_target(GTest::gmock) check_target(GTest::gmock_main) - - list(APPEND ABSL_TEST_COMMON_LIBRARIES - GTest::gtest_main - GTest::gtest - GTest::gmock - ${CMAKE_THREAD_LIBS_INIT} - ) endif() add_subdirectory(absl) diff --git a/absl/debugging/internal/stacktrace_x86-inl.inc b/absl/debugging/internal/stacktrace_x86-inl.inc index 70f79dfc..847a5473 100644 --- a/absl/debugging/internal/stacktrace_x86-inl.inc +++ b/absl/debugging/internal/stacktrace_x86-inl.inc @@ -27,6 +27,7 @@ #include <cassert> #include <cstdint> +#include <limits> #include "absl/base/macros.h" #include "absl/base/port.h" @@ -158,7 +159,8 @@ static uintptr_t GetFP(const void *vuc) { template <bool STRICT_UNWINDING, bool WITH_CONTEXT> ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS // May read random elements from stack. ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY // May read random elements from stack. -static void **NextStackFrame(void **old_fp, const void *uc) { +static void **NextStackFrame(void **old_fp, const void *uc, + size_t stack_low, size_t stack_high) { void **new_fp = (void **)*old_fp; #if defined(__linux__) && defined(__i386__) @@ -257,6 +259,18 @@ static void **NextStackFrame(void **old_fp, const void *uc) { // at a greater address that the current one. if (new_fp_u <= old_fp_u) return nullptr; if (new_fp_u - old_fp_u > kMaxFrameBytes) return nullptr; + + if (stack_low < old_fp_u && old_fp_u <= stack_high) { + // Old BP was in the expected stack region... + if (!(stack_low < new_fp_u && new_fp_u <= stack_high)) { + // ... but new BP is outside of expected stack region. + // It is most likely bogus. + return nullptr; + } + } else { + // We may be here if we are executing in a co-routine with a + // separate stack. We can't do safety checks in this case. + } } else { if (new_fp == nullptr) return nullptr; // skip AddressIsReadable() below // In the non-strict mode, allow discontiguous stack frames. @@ -296,13 +310,17 @@ static int UnwindImpl(void **result, int *sizes, int max_depth, int skip_count, int n = 0; void **fp = reinterpret_cast<void **>(__builtin_frame_address(0)); + size_t stack_low = getpagesize(); // Assume that the first page is not stack. + size_t stack_high = std::numeric_limits<size_t>::max() - sizeof(void *); + while (fp && n < max_depth) { if (*(fp + 1) == reinterpret_cast<void *>(0)) { // In 64-bit code, we often see a frame that // points to itself and has a return address of 0. break; } - void **next_fp = NextStackFrame<!IS_STACK_FRAMES, IS_WITH_CONTEXT>(fp, ucp); + void **next_fp = NextStackFrame<!IS_STACK_FRAMES, IS_WITH_CONTEXT>( + fp, ucp, stack_low, stack_high); if (skip_count > 0) { skip_count--; } else { @@ -325,7 +343,8 @@ static int UnwindImpl(void **result, int *sizes, int max_depth, int skip_count, const int kMaxUnwind = 1000; int j = 0; for (; fp != nullptr && j < kMaxUnwind; j++) { - fp = NextStackFrame<!IS_STACK_FRAMES, IS_WITH_CONTEXT>(fp, ucp); + fp = NextStackFrame<!IS_STACK_FRAMES, IS_WITH_CONTEXT>(fp, ucp, stack_low, + stack_high); } *min_dropped_frames = j; } diff --git a/absl/status/BUILD.bazel b/absl/status/BUILD.bazel index 0e5b3508..bae5156f 100644 --- a/absl/status/BUILD.bazel +++ b/absl/status/BUILD.bazel @@ -47,6 +47,7 @@ cc_library( "//absl/container:inlined_vector", "//absl/debugging:stacktrace", "//absl/debugging:symbolize", + "//absl/functional:function_ref", "//absl/strings", "//absl/strings:cord", "//absl/strings:str_format", diff --git a/absl/status/CMakeLists.txt b/absl/status/CMakeLists.txt index 43898564..f107c85b 100644 --- a/absl/status/CMakeLists.txt +++ b/absl/status/CMakeLists.txt @@ -29,6 +29,7 @@ absl_cc_library( absl::atomic_hook absl::config absl::core_headers + absl::function_ref absl::raw_logging_internal absl::inlined_vector absl::stacktrace diff --git a/absl/status/status.cc b/absl/status/status.cc index 53c198e1..bcf3413e 100644 --- a/absl/status/status.cc +++ b/absl/status/status.cc @@ -161,7 +161,7 @@ bool Status::ErasePayload(absl::string_view type_url) { } void Status::ForEachPayload( - const std::function<void(absl::string_view, const absl::Cord&)>& visitor) + absl::FunctionRef<void(absl::string_view, const absl::Cord&)> visitor) const { if (auto* payloads = GetPayloads()) { bool in_reverse = diff --git a/absl/status/status.h b/absl/status/status.h index 9bb45382..39071e5f 100644 --- a/absl/status/status.h +++ b/absl/status/status.h @@ -55,6 +55,7 @@ #include <string> #include "absl/container/inlined_vector.h" +#include "absl/functional/function_ref.h" #include "absl/status/internal/status_internal.h" #include "absl/strings/cord.h" #include "absl/strings/string_view.h" @@ -590,7 +591,7 @@ class Status final { // NOTE: Any mutation on the same 'absl::Status' object during visitation is // forbidden and could result in undefined behavior. void ForEachPayload( - const std::function<void(absl::string_view, const absl::Cord&)>& visitor) + absl::FunctionRef<void(absl::string_view, const absl::Cord&)> visitor) const; private: diff --git a/absl/strings/internal/cord_internal.h b/absl/strings/internal/cord_internal.h index 7172b147..0300ac40 100644 --- a/absl/strings/internal/cord_internal.h +++ b/absl/strings/internal/cord_internal.h @@ -37,7 +37,7 @@ class CordzInfo; // Default feature enable states for cord ring buffers enum CordFeatureDefaults { - kCordEnableBtreeDefault = false, + kCordEnableBtreeDefault = true, kCordEnableRingBufferDefault = false, kCordShallowSubcordsDefault = false }; |