Skip to content

test/mds: fix stack-use-after-scope in unittest_mds_quiesce_db#66851

Merged
batrick merged 1 commit intoceph:mainfrom
tchaikov:wip-unittest_mds_quiesce_db-silence-asan-warning
Jan 28, 2026
Merged

test/mds: fix stack-use-after-scope in unittest_mds_quiesce_db#66851
batrick merged 1 commit intoceph:mainfrom
tchaikov:wip-unittest_mds_quiesce_db-silence-asan-warning

Conversation

@tchaikov
Copy link
Contributor

@tchaikov tchaikov commented Jan 9, 2026

The cartesian_apply() function in TestQuiesceDb.cc had a stack-use- after-scope issue detected by ASan. The problem was that the lambda function at line 513 had an implicit return type deduction that returned a value instead of a reference:

  auto f = [&q](const auto &args) {
    q = div(q.quot, args.size());
    return args.at(q.rem);  // Returns V instead of V const&
  };

Even though args.at(q.rem) returns a const reference to an element in the array, the lambda's auto return type deduction caused it to return by value. This meant the tuple at line 518:

  auto apply_tuple = std::tuple<V const &...> { f(array_args)... };

was storing references to temporary values that went out of scope immediately after tuple construction. When std::apply() later tried to use these references, it accessed freed stack memory.

Fix by explicitly specifying the lambda's return type as decltype(auto) to preserve the reference semantics:

  auto f = [&q](const auto &args) -> decltype(auto) {
    q = div(q.quot, args.size());
    return args.at(q.rem);  // Now returns V const& as intended
  };

This ensures the lambda returns a reference to the array element, which remains valid for the lifetime of array_args (the entire scope of cartesian_apply()). This preserves the original optimization of avoiding copies while fixing the use-after-scope issue.

Contribution Guidelines

  • To sign and title your commits, please refer to Submitting Patches to Ceph.

  • If you are submitting a fix for a stable branch (e.g. "quincy"), please refer to Submitting Patches to Ceph - Backports for the proper workflow.

  • When filling out the below checklist, you may click boxes directly in the GitHub web UI. When entering or editing the entire PR message in the GitHub web UI editor, you may also select a checklist item by adding an x between the brackets: [x]. Spaces and capitalization matter when checking off items this way.

Checklist

  • Tracker (select at least one)
    • References tracker ticket
    • Very recent bug; references commit where it was introduced
    • New feature (ticket optional)
    • Doc update (no ticket needed)
    • Code cleanup (no ticket needed)
  • Component impact
    • Affects Dashboard, opened tracker ticket
    • Affects Orchestrator, opened tracker ticket
    • No impact that needs to be tracked
  • Documentation (select at least one)
    • Updates relevant documentation
    • No doc update is appropriate
  • Tests (select at least one)
Show available Jenkins commands

You must only issue one Jenkins command per-comment. Jenkins does not understand
comments with more than one command.

The cartesian_apply() function in TestQuiesceDb.cc had a stack-use-
after-scope issue detected by ASan. The problem was that the lambda
function at line 513 had an implicit return type deduction that
returned a value instead of a reference:

  auto f = [&q](const auto &args) {
    q = div(q.quot, args.size());
    return args.at(q.rem);  // Returns V instead of V const&
  };

Even though args.at(q.rem) returns a const reference to an element
in the array, the lambda's auto return type deduction caused it to
return by value. This meant the tuple at line 518:

  auto apply_tuple = std::tuple<V const &...> { f(array_args)... };

was storing references to temporary values that went out of scope
immediately after tuple construction. When std::apply() later tried
to use these references, it accessed freed stack memory.

Fix by explicitly specifying the lambda's return type as decltype(auto)
to preserve the reference semantics:

  auto f = [&q](const auto &args) -> decltype(auto) {
    q = div(q.quot, args.size());
    return args.at(q.rem);  // Now returns V const& as intended
  };

This ensures the lambda returns a reference to the array element,
which remains valid for the lifetime of array_args (the entire scope
of cartesian_apply()). This preserves the original optimization of
avoiding copies while fixing the use-after-scope issue.

Signed-off-by: Kefu Chai <k.chai@proxmox.com>
@github-actions github-actions bot added the tests label Jan 9, 2026
@tchaikov tchaikov requested a review from athanatos January 9, 2026 04:06
@tchaikov
Copy link
Contributor Author

tchaikov commented Jan 9, 2026

the failure is observed when testing with ASan enabled:

[ RUN      ] QuiesceDbTest.QuiesceRequestValidation
=================================================================
==4977==ERROR: AddressSanitizer: stack-use-after-scope on address 0x7fcd7d189cd0 at pc 0x62a05b822eca bp 0x7fffc5dd93b0 sp 0x7fffc5dd93a8
READ of size 1 at 0x7fcd7d189cd0 thread T0
    #0 0x62a05b822ec9 in QuiesceDbTest_QuiesceRequestValidation_Test::TestBody()::$_0::operator()(QuiesceDbRequest::RootsOp const&, std::optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>> const&, std::optional<unsigned long> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::unordered_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>> const&) const /ceph/src/test/mds/TestQuiesceDb.cc:547:28
    #1 0x62a05b822995 in bool std::__invoke_impl<bool, QuiesceDbTest_QuiesceRequestValidation_Test::TestBody()::$_0&, QuiesceDbRequest::RootsOp const&, std::optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>> const&, std::optional<unsigned long> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::unordered_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>> const&>(std::__invoke_other, QuiesceDbTest_QuiesceRequestValidation_Test::TestBody()::$_0&, QuiesceDbRequest::RootsOp const&, std::optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>> const&, std::optional<unsigned long> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::unordered_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>> const&) /usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/invoke.h:61:14
    #2 0x62a05b822935 in std::__invoke_result<QuiesceDbTest_QuiesceRequestValidation_Test::TestBody()::$_0&, QuiesceDbRequest::RootsOp const&, std::optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>> const&, std::optional<unsigned long> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::unordered_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>> const&>::type std::__invoke<QuiesceDbTest_QuiesceRequestValidation_Test::TestBody()::$_0&, QuiesceDbRequest::RootsOp const&, std::optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>> const&, std::optional<unsigned long> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::unordered_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>> const&>(QuiesceDbTest_QuiesceRequestValidation_Test::TestBody()::$_0&, QuiesceDbRequest::RootsOp const&, std::optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>> const&, std::optional<unsigned long> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::unordered_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>> const&) /usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/invoke.h:96:14
    #3 0x62a05b8228c8 in decltype(auto) std::__apply_impl<QuiesceDbTest_QuiesceRequestValidation_Test::TestBody()::$_0&, std::tuple<QuiesceDbRequest::RootsOp const&, std::optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>> const&, std::optional<unsigned long> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::unordered_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>> const&>&, 0ul, 1ul, 2ul, 3ul, 4ul, 5ul, 6ul>(QuiesceDbTest_QuiesceRequestValidation_Test::TestBody()::$_0&, std::tuple<QuiesceDbRequest::RootsOp const&, std::optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>> const&, std::optional<unsigned long> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::unordered_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>> const&>&, std::integer_sequence<unsigned long, 0ul, 1ul, 2ul, 3ul, 4ul, 5ul, 6ul>) /usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/tuple:1852:14
    #4 0x62a05b82281c in decltype(auto) std::apply<QuiesceDbTest_QuiesceRequestValidation_Test::TestBody()::$_0&, std::tuple<QuiesceDbRequest::RootsOp const&, std::optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>> const&, std::optional<unsigned long> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::unordered_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>> const&>&>(QuiesceDbTest_QuiesceRequestValidation_Test::TestBody()::$_0&, std::tuple<QuiesceDbRequest::RootsOp const&, std::optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>> const&, std::optional<unsigned long> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::unordered_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>> const&>&) /usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/tuple:1863:14
    #5 0x62a05b7d4a1e in void cartesian_apply<QuiesceDbTest_QuiesceRequestValidation_Test::TestBody()::$_0, QuiesceDbRequest::RootsOp, std::optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::optional<unsigned long>, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>>, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>>, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>>, std::unordered_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>>, 4ul, 2ul, 2ul, 2ul, 2ul, 2ul, 2ul>(T, std::array<T0, 4ul> const&, std::array<T0, 2ul> const&, std::array<T0, 2ul> const&, std::array<T0, 2ul> const&, std::array<T0, 2ul> const&, std::array<T0, 2ul> const&, std::array<T0, 2ul> const&) /ceph/src/test/mds/TestQuiesceDb.cc:523:10
    #6 0x62a05b7d423a in QuiesceDbTest_QuiesceRequestValidation_Test::TestBody() /ceph/src/test/mds/TestQuiesceDb.cc:615:3
    #7 0x62a05b9f350d in void testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) /ceph/src/googletest/googletest/src/gtest.cc:2653:10
    #8 0x62a05b9ae135 in void testing::internal::HandleExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) /ceph/src/googletest/googletest/src/gtest.cc:2689:14
    #9 0x62a05b96878d in testing::Test::Run() /ceph/src/googletest/googletest/src/gtest.cc:2728:5
    #10 0x62a05b969f0c in testing::TestInfo::Run() /ceph/src/googletest/googletest/src/gtest.cc:2874:11
    #11 0x62a05b96b385 in testing::TestSuite::Run() /ceph/src/googletest/googletest/src/gtest.cc:3052:30
    #12 0x62a05b98bbe4 in testing::internal::UnitTestImpl::RunAllTests() /ceph/src/googletest/googletest/src/gtest.cc:6004:44
    #13 0x62a05b9f6fbd in bool testing::internal::HandleSehExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) /ceph/src/googletest/googletest/src/gtest.cc:2653:10
    #14 0x62a05b9b2f2a in bool testing::internal::HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) /ceph/src/googletest/googletest/src/gtest.cc:2689:14
    #15 0x62a05b98afd9 in testing::UnitTest::Run() /ceph/src/googletest/googletest/src/gtest.cc:5583:10
    #16 0x62a05b7c97a0 in RUN_ALL_TESTS() /ceph/src/googletest/googletest/include/gtest/gtest.h:2334:73
    #17 0x62a05b7c88fe in main /ceph/src/test/unit.cc:46:10
    #18 0x7fcd7f629d8f in __libc_start_call_main csu/../sysdeps/nptl/libc_start_call_main.h:58:16
    #19 0x7fcd7f629e3f in __libc_start_main csu/../csu/libc-start.c:392:3
    #20 0x62a05b6e6b74 in _start (/ceph/build/bin/unittest_mds_quiesce_db+0x1b8b74) (BuildId: 6b6da87ce257591160d8d46ffb3595c77f1d04ec)

Address 0x7fcd7d189cd0 is located in stack of thread T0 at offset 208 in frame
    #0 0x62a05b7d456f in void cartesian_apply<QuiesceDbTest_QuiesceRequestValidation_Test::TestBody()::$_0, QuiesceDbRequest::RootsOp, std::optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::optional<unsigned long>, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>>, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>>, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>>, std::unordered_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>>, 4ul, 2ul, 2ul, 2ul, 2ul, 2ul, 2ul>(T, std::array<T0, 4ul> const&, std::array<T0, 2ul> const&, std::array<T0, 2ul> const&, std::array<T0, 2ul> const&, std::array<T0, 2ul> const&, std::array<T0, 2ul> const&, std::array<T0, 2ul> const&) /ceph/src/test/mds/TestQuiesceDb.cc:501

  This frame has 11 object(s):
    [32, 33) 'func'
    [48, 64) 'q' (line 508)
    [80, 88) 'f' (line 513)
    [112, 168) 'apply_tuple' (line 518)
    [208, 209) 'ref.tmp' (line 518) <== Memory access at offset 208 is inside this variable
    [224, 264) 'ref.tmp13' (line 518)
    [304, 320) 'ref.tmp14' (line 518)
    [336, 352) 'ref.tmp17' (line 518)
    [368, 384) 'ref.tmp23' (line 518)
    [400, 416) 'ref.tmp29' (line 518)
    [432, 488) 'ref.tmp35' (line 518)
HINT: this may be a false positive if your program uses some custom stack unwind mechanism, swapcontext or vfork
      (longjmp and C++ exceptions *are* supported)
SUMMARY: AddressSanitizer: stack-use-after-scope /ceph/src/test/mds/TestQuiesceDb.cc:547:28 in QuiesceDbTest_QuiesceRequestValidation_Test::TestBody()::$_0::operator()(QuiesceDbRequest::RootsOp const&, std::optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>> const&, std::optional<unsigned long> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::optional<std::chrono::duration<unsigned long, std::ratio<1l, 1000000000l>>> const&, std::unordered_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>> const&) const
Shadow bytes around the buggy address:
  0x7fcd7d189a00: f8 f2 f8 f2 f8 f3 f3 f3 00 00 00 00 00 00 00 00
  0x7fcd7d189a80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x7fcd7d189b00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x7fcd7d189b80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x7fcd7d189c00: f1 f1 f1 f1 01 f2 00 00 f2 f2 00 f2 f2 f2 00 00
=>0x7fcd7d189c80: 00 00 00 00 00 f2 f2 f2 f2 f2[f8]f2 f8 f8 f8 f8
  0x7fcd7d189d00: f8 f2 f2 f2 f2 f2 f8 f8 f2 f2 f8 f8 f2 f2 f8 f8
  0x7fcd7d189d80: f2 f2 f8 f8 f2 f2 f8 f8 f8 f8 f8 f8 f8 f3 f3 f3
  0x7fcd7d189e00: f3 f3 f3 f3 00 00 00 00 00 00 00 00 00 00 00 00
  0x7fcd7d189e80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x7fcd7d189f00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
==4977==ABORTING

@tchaikov
Copy link
Contributor Author

tchaikov commented Jan 9, 2026

@athanatos hi Sam, could you help review this change?

@tchaikov tchaikov mentioned this pull request Jan 9, 2026
14 tasks
@tchaikov
Copy link
Contributor Author

tchaikov commented Jan 9, 2026

jenkins test make check

1 similar comment
@tchaikov
Copy link
Contributor Author

tchaikov commented Jan 9, 2026

jenkins test make check

@tchaikov
Copy link
Contributor Author

@batrick hi Patrick, could you help review this change?

@tchaikov tchaikov requested a review from batrick January 28, 2026 11:17
@batrick batrick added cephfs Ceph File System needs-qa labels Jan 28, 2026
@batrick batrick merged commit 3f1becf into ceph:main Jan 28, 2026
25 of 29 checks passed
@tchaikov tchaikov deleted the wip-unittest_mds_quiesce_db-silence-asan-warning branch January 28, 2026 13:01
@tchaikov
Copy link
Contributor Author

Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants