test: Avoid accessing free'd memory in validation_chainstatemanager_tests #18615

pull MarcoFalke wants to merge 1 commits into bitcoin:master from MarcoFalke:2004-testNoAccessFreeMem changing 2 files +8 −9
  1. MarcoFalke commented at 12:15 AM on April 13, 2020: member

    No description provided.

  2. MarcoFalke force-pushed on Apr 13, 2020
  3. fanquake added the label Tests on Apr 13, 2020
  4. MarcoFalke force-pushed on Apr 13, 2020
  5. MarcoFalke force-pushed on Apr 13, 2020
  6. MarcoFalke force-pushed on Apr 13, 2020
  7. practicalswift commented at 5:17 PM on April 13, 2020: contributor

    Concept ACK

    Did any of the sanitizers find this issue?

  8. MarcoFalke commented at 5:50 PM on April 13, 2020: member

    Yes, this should be hit in sanitizers when additionally the validationinterface debug log category is enabled.

  9. jamesob commented at 5:14 PM on April 14, 2020: member
  10. in src/test/validation_chainstatemanager_tests.cpp:105 in fac4a9757b outdated
      97 | @@ -97,7 +98,13 @@ BOOST_AUTO_TEST_CASE(chainstatemanager)
      98 |      exp_tip = c1.m_chain.Tip();
      99 |      BOOST_CHECK_EQUAL(validated_tip, exp_tip);
     100 |  
     101 | -    // Avoid triggering the address sanitizer.
     102 | +    // Drop any events from the scheduler to avoid accessing memory that is going to be unloaded
     103 | +    m_node.scheduler->stop();
     104 | +    threadGroup.interrupt_all();
     105 | +    threadGroup.join_all();
     106 | +    GetMainSignals().FlushBackgroundCallbacks();
    


    ryanofsky commented at 5:22 PM on April 14, 2020:

    Could be wrong, but I'd think FlushBackgroundCallbacks should be called before scheduler->stop because flushing uses the scheduler


    ryanofsky commented at 5:24 PM on April 14, 2020:

    Never mind, I confused FlushBackgroundCallbacks with SyncWithValidationInterfaceQueue

  11. in src/test/validation_chainstatemanager_tests.cpp:106 in fac4a9757b outdated
     102 | +    // Drop any events from the scheduler to avoid accessing memory that is going to be unloaded
     103 | +    m_node.scheduler->stop();
     104 | +    threadGroup.interrupt_all();
     105 | +    threadGroup.join_all();
     106 | +    GetMainSignals().FlushBackgroundCallbacks();
     107 | +    GetMainSignals().UnregisterBackgroundSignalScheduler();
    


    ryanofsky commented at 6:33 PM on April 14, 2020:

    Would just calling SyncWithValidationInterfaceQueue here instead of dropping notifications and cleaning everything up work?

    If I'm understanding the bug correctly, the problem is a race condition where scheduled notifications from code above are racing to finish before manager.Unload() below. If this is the case, calling Sync should be a better fix because it would remove nondeterminism from the test (notifications non deterministically getting executing or dropped). Also it would avoid having cleanup code in the test that duplicates fixture cleanup code and runs twice


    MarcoFalke commented at 3:06 PM on April 15, 2020:

    Thanks. Done

  12. ryanofsky approved
  13. ryanofsky commented at 6:34 PM on April 14, 2020: contributor

    Code review ACK fac4a9757b3bfd131a78570866c349b590f492ca, but see question below. I think this may not be the ideal fix

  14. MarcoFalke force-pushed on Apr 15, 2020
  15. in src/test/validation_chainstatemanager_tests.cpp:101 in fa4cb83303 outdated
      97 | @@ -97,7 +98,9 @@ BOOST_AUTO_TEST_CASE(chainstatemanager)
      98 |      exp_tip = c1.m_chain.Tip();
      99 |      BOOST_CHECK_EQUAL(validated_tip, exp_tip);
     100 |  
     101 | -    // Avoid triggering the address sanitizer.
     102 | +    // Drop any events from the scheduler to avoid accessing memory that is going to be unloaded
    


    ryanofsky commented at 3:32 PM on April 15, 2020:

    Would say "Let scheduler events finish running to avoid..." instead of "Drop any events from the scheduler to avoid..."


    MarcoFalke commented at 3:46 PM on April 15, 2020:

    Thanks, done

  16. ryanofsky approved
  17. ryanofsky commented at 3:33 PM on April 15, 2020: contributor

    Code review ACK fa4cb833037a8a59dc511a9773aa5d64a416066e

  18. test: Avoid accessing free'd memory in validation_chainstatemanager_tests fa176e253f
  19. MarcoFalke force-pushed on Apr 15, 2020
  20. jamesob cross-referenced this on Apr 15, 2020 from issue coins: allow cache resize after init by jamesob
  21. ryanofsky approved
  22. ryanofsky commented at 4:48 PM on April 15, 2020: contributor

    Code review ACK fa176e253fb473767c61d4d8cd2d93e87d71a015, though if you have to update this again, would suggest separating txindex test cleanup and the chainstatemanager test fix in separate commits, or identifying which part of the change is the bugfix fix in the commit description. Also to clean up the txindex test it might make sense to call SyncWithValidationInterfaceQueue in the test destructor to prevent nondeterminism in other tests

  23. MarcoFalke commented at 4:52 PM on April 15, 2020: member

    Also to clean up the txindex test it might make sense to call SyncWithValidationInterfaceQueue in the test destructor to prevent nondeterminism in other tests

    It needs to happen before the TestingSetup is destructed, because txindex is scoped inside the test case.

  24. ryanofsky commented at 5:26 PM on April 15, 2020: contributor

    It needs to happen before the TestingSetup is destructed, because txindex is scoped inside the test case.

    Missed that, thanks.

  25. MarcoFalke merged this on Apr 15, 2020
  26. MarcoFalke closed this on Apr 15, 2020

  27. MarcoFalke cross-referenced this on Apr 15, 2020 from issue fuzz: Disable debug log file by MarcoFalke
  28. MarcoFalke deleted the branch on Apr 15, 2020
  29. Fabcien referenced this in commit 3d4316d11f on Dec 9, 2020
  30. vijaydasmp referenced this in commit 1ec217b843 on Sep 5, 2021
  31. bitcoin locked this on Feb 15, 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: 2026-05-20 06:54 UTC