refactor: Avoid UB in util/asmap (advance a dereferenceable iterator outside its valid range) #21802

pull MarcoFalke wants to merge 1 commits into bitcoin:master from MarcoFalke:2104-asmapRefactor changing 1 files +2 −4
  1. MarcoFalke commented at 6:56 am on April 29, 2021: member

    Can be reproduced on current master with D_GLIBCXX_DEBUG:

     0/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/debug/safe_iterator.h:883:
     1In function:
     2    __gnu_debug::_Safe_iterator<type-parameter-0-0, type-parameter-0-1, 
     3    std::random_access_iterator_tag>::_Self __gnu_debug::operator+(const 
     4    __gnu_debug::_Safe_iterator<type-parameter-0-0, type-parameter-0-1, 
     5    std::random_access_iterator_tag>::_Self &, 
     6    __gnu_debug::_Safe_iterator<type-parameter-0-0, type-parameter-0-1, 
     7    std::random_access_iterator_tag>::difference_type)
     8
     9Error: attempt to advance a dereferenceable iterator 369 steps, which falls 
    10outside its valid range.
    11
    12Objects involved in the operation:
    13    iterator @ 0x0x7ffd3d613138 {
    14      type = std::__cxx1998::_Bit_const_iterator (constant iterator);
    15      state = dereferenceable;
    16      references sequence with type 'std::__debug::vector<bool, std::allocator<bool> >' @ 0x0x7ffd3d663590
    17    }
    18==65050== ERROR: libFuzzer: deadly signal
    19    [#0](/bitcoin-bitcoin/0/) 0x559ab9787690 in __sanitizer_print_stack_trace (/bitcoin/src/test/fuzz/fuzz+0x5a1690)
    20    [#1](/bitcoin-bitcoin/1/) 0x559ab9733998 in fuzzer::PrintStackTrace() (/bitcoin/src/test/fuzz/fuzz+0x54d998)
    21    [#2](/bitcoin-bitcoin/2/) 0x559ab9718ae3 in fuzzer::Fuzzer::CrashCallback() (/bitcoin/src/test/fuzz/fuzz+0x532ae3)
    22    [#3](/bitcoin-bitcoin/3/) 0x7f70a0e723bf  (/lib/x86_64-linux-gnu/libpthread.so.0+0x153bf)
    23    [#4](/bitcoin-bitcoin/4/) 0x7f70a0b3418a in raise (/lib/x86_64-linux-gnu/libc.so.6+0x4618a)
    24    [#5](/bitcoin-bitcoin/5/) 0x7f70a0b13858 in abort (/lib/x86_64-linux-gnu/libc.so.6+0x25858)
    25    [#6](/bitcoin-bitcoin/6/) 0x7f70a0f21148  (/lib/x86_64-linux-gnu/libstdc++.so.6+0xa1148)
    26    [#7](/bitcoin-bitcoin/7/) 0x559ab9f60a96 in __gnu_debug::operator+(__gnu_debug::_Safe_iterator<std::__cxx1998::_Bit_const_iterator, std::__debug::vector<bool, std::allocator<bool> >, std::random_access_iterator_tag> const&, long) /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/debug/safe_iterator.h:881:2
    27    [#8](/bitcoin-bitcoin/8/) 0x559ab9f61062 in SanityCheckASMap(std::__debug::vector<bool, std::allocator<bool> > const&, int) util/asmap.cpp:159:21
    28    [#9](/bitcoin-bitcoin/9/) 0x559ab9e4fdfa in SanityCheckASMap(std::__debug::vector<bool, std::allocator<bool> > const&) netaddress.cpp:1242:12
    29    [#10](/bitcoin-bitcoin/10/) 0x559ab9793fcb in addrman_fuzz_target(Span<unsigned char const>) test/fuzz/addrman.cpp:43:14
    30    [#11](/bitcoin-bitcoin/11/) 0x559ab978a03c in std::_Function_handler<void (Span<unsigned char const>), void (*)(Span<unsigned char const>)>::_M_invoke(std::_Any_data const&, Span<unsigned char const>&&) /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/std_function.h:300:2
    31    [#12](/bitcoin-bitcoin/12/) 0x559aba2692c7 in std::function<void (Span<unsigned char const>)>::operator()(Span<unsigned char const>) const /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/std_function.h:688:14
    32    [#13](/bitcoin-bitcoin/13/) 0x559aba269132 in LLVMFuzzerTestOneInput test/fuzz/fuzz.cpp:63:5
    33    [#14](/bitcoin-bitcoin/14/) 0x559ab971a1a1 in fuzzer::Fuzzer::ExecuteCallback(unsigned char const*, unsigned long) (/bitcoin/src/test/fuzz/fuzz+0x5341a1)
    34    [#15](/bitcoin-bitcoin/15/) 0x559ab97198e5 in fuzzer::Fuzzer::RunOne(unsigned char const*, unsigned long, bool, fuzzer::InputInfo*, bool*) (/bitcoin/src/test/fuzz/fuzz+0x5338e5)
    35    [#16](/bitcoin-bitcoin/16/) 0x559ab971bb87 in fuzzer::Fuzzer::MutateAndTestOne() (/bitcoin/src/test/fuzz/fuzz+0x535b87)
    36    [#17](/bitcoin-bitcoin/17/) 0x559ab971c885 in fuzzer::Fuzzer::Loop(std::__Fuzzer::vector<fuzzer::SizedFile, fuzzer::fuzzer_allocator<fuzzer::SizedFile> >&) (/bitcoin/src/test/fuzz/fuzz+0x536885)
    37    [#18](/bitcoin-bitcoin/18/) 0x559ab970b23e in fuzzer::FuzzerDriver(int*, char***, int (*)(unsigned char const*, unsigned long)) (/bitcoin/src/test/fuzz/fuzz+0x52523e)
    38    [#19](/bitcoin-bitcoin/19/) 0x559ab9734082 in main (/bitcoin/src/test/fuzz/fuzz+0x54e082)
    39    [#20](/bitcoin-bitcoin/20/) 0x7f70a0b150b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
    40    [#21](/bitcoin-bitcoin/21/) 0x559ab96dffdd in _start (/bitcoin/src/test/fuzz/fuzz+0x4f9fdd)
    
  2. MarcoFalke force-pushed on Apr 29, 2021
  3. DrahtBot added the label Refactoring on Apr 29, 2021
  4. DrahtBot added the label Utils/log/libs on Apr 29, 2021
  5. vasild approved
  6. vasild commented at 8:58 am on April 29, 2021: member

    ACK fabe592fd348a9961de363d5f4821505bd5dd6e3

    Maybe squash the two commits into one because the first one leaves the tree with a compiler warning which may be a problem during git bisect with -Werror. The changes are not so big or unrelated to warrant separate commits.

  7. refactor: Avoid sign-compare compiler warning in util/asmap
    This reverts commit eac6a3080d38cfd4eb7204ecd327df213958e51a ("refactor:
    Rework asmap Interpret to avoid ptrdiff_t"), because it is UB to form a
    past-the-end iterator, even if it is never dereferenced.
    
    Then fix the compiler warning in a different way:
    Instead of comparing an uint32_t against a signed ptrdiff_t, just
    promote both to a type that can represent both types.
    
    Even though in this case the ptrdiff_t should never hold a negative
    value, the overhead from promotion should be negligible.
    fa09871320
  8. MarcoFalke force-pushed on Apr 29, 2021
  9. MarcoFalke commented at 9:43 am on April 29, 2021: member
    Thanks, squashed
  10. vasild approved
  11. vasild commented at 12:00 pm on April 29, 2021: member
    ACK fa098713201a6999ec4c12d0a8bde0adcf47b095
  12. adamjonas commented at 4:02 pm on April 29, 2021: member

    Reproduced on master with D_GLIBCXX_DEBUG via running the fuzzer over asmap and asmap direct

     0INFO: Loaded 1 modules   (811800 inline 8-bit counters): 811800 [0x56282d063a10, 0x56282d129d28),
     1INFO: Loaded 1 PC tables (811800 PCs): 811800 [0x56282d129d28,0x56282dd8cea8),
     2INFO:     1070 files found in qa-assets/fuzz_seed_corpus/asmap/
     3INFO: -max_len is not provided; libFuzzer will not generate inputs larger than 292568 bytes
     4INFO: seed corpus: files: 1070 min: 1b max: 292568b total: 5871094b rss: 161Mb
     5/usr/bin/../lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/debug/safe_iterator.h:908:
     6In function:
     7    __gnu_debug::_Safe_iterator<type-parameter-0-0, type-parameter-0-1,
     8    std::random_access_iterator_tag>::_Self __gnu_debug::operator+(const
     9    __gnu_debug::_Safe_iterator<type-parameter-0-0, type-parameter-0-1,
    10    std::random_access_iterator_tag>::_Self &,
    11    __gnu_debug::_Safe_iterator<type-parameter-0-0, type-parameter-0-1,
    12    std::random_access_iterator_tag>::difference_type)
    13
    14Error: attempt to advance a dereferenceable iterator 8167 steps, which falls
    15outside its valid range.
    16
    17Objects involved in the operation:
    18    iterator @ 0x0x7ffc4397d7f0 {
    19      type = std::__cxx1998::_Bit_const_iterator (constant iterator);
    20      state = dereferenceable;
    21      references sequence with type 'std::__debug::vector<bool, std::allocator<bool> >' @ 0x0x7ffc4397dac0
    22    }
    23==135635== ERROR: libFuzzer: deadly signal
    24    [#0](/bitcoin-bitcoin/0/) 0x562826cc6fd1 in __sanitizer_print_stack_trace (/home/jonas/bitcoin/src/test/fuzz/fuzz+0x3afefd1)
    25    [#1](/bitcoin-bitcoin/1/) 0x562826c12128 in fuzzer::PrintStackTrace() (/home/jonas/bitcoin/src/test/fuzz/fuzz+0x3a4a128)
    26    [#2](/bitcoin-bitcoin/2/) 0x562826bf7273 in fuzzer::Fuzzer::CrashCallback() (/home/jonas/bitcoin/src/test/fuzz/fuzz+0x3a2f273)
    27    [#3](/bitcoin-bitcoin/3/) 0x7fa76a77241f  (/lib/x86_64-linux-gnu/libpthread.so.0+0x1541f)
    28    [#4](/bitcoin-bitcoin/4/) 0x7fa76a3b618a in raise (/lib/x86_64-linux-gnu/libc.so.6+0x4618a)
    29    [#5](/bitcoin-bitcoin/5/) 0x7fa76a395858 in abort (/lib/x86_64-linux-gnu/libc.so.6+0x25858)
    30    [#6](/bitcoin-bitcoin/6/) 0x7fa76a821148  (/lib/x86_64-linux-gnu/libstdc++.so.6+0xa1148)
    31    [#7](/bitcoin-bitcoin/7/) 0x562828748e40 in __gnu_debug::operator+(__gnu_debug::_Safe_iterator<std::__cxx1998::_Bit_const_iterator, std::__debug::vector<bool, std::allocator<bool> >, std::random_access_iterator_tag> const&, long) /usr/bin/../lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/debug/safe_iterator.h:906:2
    32    [#8](/bitcoin-bitcoin/8/) 0x56282874a24c in SanityCheckASMap(std::__debug::vector<bool, std::allocator<bool> > const&, int) /home/jonas/bitcoin/src/util/asmap.cpp:159:21
    33    [#9](/bitcoin-bitcoin/9/) 0x5628283ea928 in SanityCheckASMap(std::__debug::vector<bool, std::allocator<bool> > const&) /home/jonas/bitcoin/src/netaddress.cpp:1242:12
    34    [#10](/bitcoin-bitcoin/10/) 0x562826d80b92 in asmap_fuzz_target(Span<unsigned char const>) /home/jonas/bitcoin/src/test/fuzz/asmap.cpp:45:10
    35    [#11](/bitcoin-bitcoin/11/) 0x562826cf3acd in void std::__invoke_impl<void, void (*&)(Span<unsigned char const>), Span<unsigned char const> >(std::__invoke_other, void (*&)(Span<unsigned char const>), Span<unsigned char const>&&) /usr/bin/../lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/invoke.h:60:14
    36    [#12](/bitcoin-bitcoin/12/) 0x562826cf37a0 in std::enable_if<is_invocable_r_v<void, void (*&)(Span<unsigned char const>), Span<unsigned char const> >, void>::type std::__invoke_r<void, void (*&)(Span<unsigned char const>), Span<unsigned char const> >(void (*&)(Span<unsigned char const>), Span<unsigned char const>&&) /usr/bin/../lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/invoke.h:110:2
    37    [#13](/bitcoin-bitcoin/13/) 0x562826cf307e in std::_Function_handler<void (Span<unsigned char const>), void (*)(Span<unsigned char const>)>::_M_invoke(std::_Any_data const&, Span<unsigned char const>&&) /usr/bin/../lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/std_function.h:291:9
    38    [#14](/bitcoin-bitcoin/14/) 0x56282909c437 in std::function<void (Span<unsigned char const>)>::operator()(Span<unsigned char const>) const /usr/bin/../lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/std_function.h:622:14
    39    [#15](/bitcoin-bitcoin/15/) 0x56282909c0e5 in LLVMFuzzerTestOneInput /home/jonas/bitcoin/src/test/fuzz/fuzz.cpp:63:5
    40    [#16](/bitcoin-bitcoin/16/) 0x562826bf8931 in fuzzer::Fuzzer::ExecuteCallback(unsigned char const*, unsigned long) (/home/jonas/bitcoin/src/test/fuzz/fuzz+0x3a30931)
    41    [#17](/bitcoin-bitcoin/17/) 0x562826bf8075 in fuzzer::Fuzzer::RunOne(unsigned char const*, unsigned long, bool, fuzzer::InputInfo*, bool*) (/home/jonas/bitcoin/src/test/fuzz/fuzz+0x3a30075)
    42    [#18](/bitcoin-bitcoin/18/) 0x562826bfa997 in fuzzer::Fuzzer::ReadAndExecuteSeedCorpora(std::__Fuzzer::vector<fuzzer::SizedFile, fuzzer::fuzzer_allocator<fuzzer::SizedFile> >&) (/home/jonas/bitcoin/src/test/fuzz/fuzz+0x3a32997)
    43    [#19](/bitcoin-bitcoin/19/) 0x562826bfacf9 in fuzzer::Fuzzer::Loop(std::__Fuzzer::vector<fuzzer::SizedFile, fuzzer::fuzzer_allocator<fuzzer::SizedFile> >&) (/home/jonas/bitcoin/src/test/fuzz/fuzz+0x3a32cf9)
    44    [#20](/bitcoin-bitcoin/20/) 0x562826be99ce in fuzzer::FuzzerDriver(int*, char***, int (*)(unsigned char const*, unsigned long)) (/home/jonas/bitcoin/src/test/fuzz/fuzz+0x3a219ce)
    45    [#21](/bitcoin-bitcoin/21/) 0x562826c12812 in main (/home/jonas/bitcoin/src/test/fuzz/fuzz+0x3a4a812)
    46    [#22](/bitcoin-bitcoin/22/) 0x7fa76a3970b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
    47    [#23](/bitcoin-bitcoin/23/) 0x562826bbe76d in _start (/home/jonas/bitcoin/src/test/fuzz/fuzz+0x39f676d)
    
     0INFO: Loaded 1 modules   (811800 inline 8-bit counters): 811800 [0x55a86b9d7a10, 0x55a86ba9dd28),
     1INFO: Loaded 1 PC tables (811800 PCs): 811800 [0x55a86ba9dd28,0x55a86c700ea8),
     2INFO:      638 files found in qa-assets/fuzz_seed_corpus/asmap_direct/
     3INFO: -max_len is not provided; libFuzzer will not generate inputs larger than 4096 bytes
     4INFO: seed corpus: files: 638 min: 1b max: 4096b total: 163116b rss: 160Mb
     5/usr/bin/../lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/debug/safe_iterator.h:908:
     6In function:
     7    __gnu_debug::_Safe_iterator<type-parameter-0-0, type-parameter-0-1,
     8    std::random_access_iterator_tag>::_Self __gnu_debug::operator+(const
     9    __gnu_debug::_Safe_iterator<type-parameter-0-0, type-parameter-0-1,
    10    std::random_access_iterator_tag>::_Self &,
    11    __gnu_debug::_Safe_iterator<type-parameter-0-0, type-parameter-0-1,
    12    std::random_access_iterator_tag>::difference_type)
    13
    14Error: attempt to advance a past-the-end iterator 18 steps, which falls
    15outside its valid range.
    16
    17Objects involved in the operation:
    18    iterator @ 0x0x7ffcd1b577b0 {
    19      type = std::__cxx1998::_Bit_const_iterator (constant iterator);
    20      state = past-the-end;
    21      references sequence with type 'std::__debug::vector<bool, std::allocator<bool> >' @ 0x0x7ffcd1b57ac0
    22    }
    23==135577== ERROR: libFuzzer: deadly signal
    24    [#0](/bitcoin-bitcoin/0/) 0x55a86563afd1 in __sanitizer_print_stack_trace (/home/jonas/bitcoin/src/test/fuzz/fuzz+0x3afefd1)
    25    [#1](/bitcoin-bitcoin/1/) 0x55a865586128 in fuzzer::PrintStackTrace() (/home/jonas/bitcoin/src/test/fuzz/fuzz+0x3a4a128)
    26    [#2](/bitcoin-bitcoin/2/) 0x55a86556b273 in fuzzer::Fuzzer::CrashCallback() (/home/jonas/bitcoin/src/test/fuzz/fuzz+0x3a2f273)
    27    [#3](/bitcoin-bitcoin/3/) 0x7fdcb293241f  (/lib/x86_64-linux-gnu/libpthread.so.0+0x1541f)
    28    [#4](/bitcoin-bitcoin/4/) 0x7fdcb257618a in raise (/lib/x86_64-linux-gnu/libc.so.6+0x4618a)
    29    [#5](/bitcoin-bitcoin/5/) 0x7fdcb2555858 in abort (/lib/x86_64-linux-gnu/libc.so.6+0x25858)
    30    [#6](/bitcoin-bitcoin/6/) 0x7fdcb29e1148  (/lib/x86_64-linux-gnu/libstdc++.so.6+0xa1148)
    31    [#7](/bitcoin-bitcoin/7/) 0x55a8670bce40 in __gnu_debug::operator+(__gnu_debug::_Safe_iterator<std::__cxx1998::_Bit_const_iterator, std::__debug::vector<bool, std::allocator<bool> >, std::random_access_iterator_tag> const&, long) /usr/bin/../lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/debug/safe_iterator.h:906:2
    32    [#8](/bitcoin-bitcoin/8/) 0x55a8670be24c in SanityCheckASMap(std::__debug::vector<bool, std::allocator<bool> > const&, int) /home/jonas/bitcoin/src/util/asmap.cpp:159:21
    33    [#9](/bitcoin-bitcoin/9/) 0x55a865702c33 in asmap_direct_fuzz_target(Span<unsigned char const>) /home/jonas/bitcoin/src/test/fuzz/asmap_direct.cpp:35:9
    34    [#10](/bitcoin-bitcoin/10/) 0x55a865667acd in void std::__invoke_impl<void, void (*&)(Span<unsigned char const>), Span<unsigned char const> >(std::__invoke_other, void (*&)(Span<unsigned char const>), Span<unsigned char const>&&) /usr/bin/../lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/invoke.h:60:14
    35    [#11](/bitcoin-bitcoin/11/) 0x55a8656677a0 in std::enable_if<is_invocable_r_v<void, void (*&)(Span<unsigned char const>), Span<unsigned char const> >, void>::type std::__invoke_r<void, void (*&)(Span<unsigned char const>), Span<unsigned char const> >(void (*&)(Span<unsigned char const>), Span<unsigned char const>&&) /usr/bin/../lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/invoke.h:110:2
    36    [#12](/bitcoin-bitcoin/12/) 0x55a86566707e in std::_Function_handler<void (Span<unsigned char const>), void (*)(Span<unsigned char const>)>::_M_invoke(std::_Any_data const&, Span<unsigned char const>&&) /usr/bin/../lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/std_function.h:291:9
    37    [#13](/bitcoin-bitcoin/13/) 0x55a867a10437 in std::function<void (Span<unsigned char const>)>::operator()(Span<unsigned char const>) const /usr/bin/../lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/std_function.h:622:14
    38    [#14](/bitcoin-bitcoin/14/) 0x55a867a100e5 in LLVMFuzzerTestOneInput /home/jonas/bitcoin/src/test/fuzz/fuzz.cpp:63:5
    39    [#15](/bitcoin-bitcoin/15/) 0x55a86556c931 in fuzzer::Fuzzer::ExecuteCallback(unsigned char const*, unsigned long) (/home/jonas/bitcoin/src/test/fuzz/fuzz+0x3a30931)
    40    [#16](/bitcoin-bitcoin/16/) 0x55a86556c075 in fuzzer::Fuzzer::RunOne(unsigned char const*, unsigned long, bool, fuzzer::InputInfo*, bool*) (/home/jonas/bitcoin/src/test/fuzz/fuzz+0x3a30075)
    41    [#17](/bitcoin-bitcoin/17/) 0x55a86556e997 in fuzzer::Fuzzer::ReadAndExecuteSeedCorpora(std::__Fuzzer::vector<fuzzer::SizedFile, fuzzer::fuzzer_allocator<fuzzer::SizedFile> >&) (/home/jonas/bitcoin/src/test/fuzz/fuzz+0x3a32997)
    42    [#18](/bitcoin-bitcoin/18/) 0x55a86556ecf9 in fuzzer::Fuzzer::Loop(std::__Fuzzer::vector<fuzzer::SizedFile, fuzzer::fuzzer_allocator<fuzzer::SizedFile> >&) (/home/jonas/bitcoin/src/test/fuzz/fuzz+0x3a32cf9)
    43    [#19](/bitcoin-bitcoin/19/) 0x55a86555d9ce in fuzzer::FuzzerDriver(int*, char***, int (*)(unsigned char const*, unsigned long)) (/home/jonas/bitcoin/src/test/fuzz/fuzz+0x3a219ce)
    44    [#20](/bitcoin-bitcoin/20/) 0x55a865586812 in main (/home/jonas/bitcoin/src/test/fuzz/fuzz+0x3a4a812)
    45    [#21](/bitcoin-bitcoin/21/) 0x7fdcb25570b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
    46    [#22](/bitcoin-bitcoin/22/) 0x55a86553276d in _start (/home/jonas/bitcoin/src/test/fuzz/fuzz+0x39f676d)
    

    Ran fa09871 and can confirmed that 100000 runs over asmap and asmap_direct yielded no crashes.

  13. sipa commented at 4:51 pm on April 29, 2021: member

    Concept ACK

    I vaguely remember we used to have a CI build that used glibc in debug mode. Don’t we have that anymore?

  14. practicalswift commented at 6:11 pm on April 29, 2021: contributor

    I vaguely remember we used to have a CI build that used glibc in debug mode. Don’t we have that anymore?

    The only mention of -D_GLIBCXX_DEBUG in the repo history is f3973040028d6a7335a3265fa0e13b599b2fac3d (2014).

    There has been some -D_GLIBCXX_DEBUG mentions here on GitHub in the past: see #14624 (comment) (2018) and the recent thread #21781 (review).

  15. MarcoFalke marked this as a draft on May 5, 2021
  16. MarcoFalke commented at 6:22 am on May 5, 2021: member
    Please don’t merge this just yet
  17. MarcoFalke marked this as ready for review on May 6, 2021
  18. MarcoFalke commented at 8:06 am on May 6, 2021: member
    (ready for review/merge again)
  19. sipa commented at 3:11 am on May 7, 2021: member
    utACK fa098713201a6999ec4c12d0a8bde0adcf47b095
  20. MarcoFalke merged this on May 7, 2021
  21. MarcoFalke closed this on May 7, 2021

  22. MarcoFalke deleted the branch on May 7, 2021
  23. sidhujag referenced this in commit 03a02aa865 on May 7, 2021
  24. gwillen referenced this in commit 21558d641d on Jun 1, 2022
  25. DrahtBot locked this on Aug 16, 2022

github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2024-12-19 00:12 UTC

This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me