net: properly handle PF_NOBAN in CConnman::Bind() #21668

pull vasild wants to merge 1 commits into bitcoin:master from vasild:fix_pf_noban_usage changing 1 files +3 −1
  1. vasild commented at 5:01 PM on April 13, 2021: member
    PF_DOWNLOAD is 0b1000000 and
    PF_NOBAN    is 0b1010000.
    

    This makes a check like flags & PF_NOBAN return true even if flags is equal to PF_DOWNLOAD.

    If -whitebind=download@1.1.1.1:8765 is specified, then 1.1.1.1:8765 should be added to the list of local addresses. We only want to avoid adding to local addresses (that are advertised) a whitebind that has noban@ flag.

    As a result of a mis-check in CConnman::Bind() we would not have added 1.1.1.1:8765 to the local addresses in the example above.

    <!-- *** Please remove the following help text before submitting: *** Pull requests without a rationale and clear improvement may be closed immediately. GUI-related pull requests should be opened against https://github.com/bitcoin-core/gui first. See CONTRIBUTING.md -->

    <!-- Please provide clear motivation for your patch and explain how it improves Bitcoin Core user experience or Bitcoin Core developer experience significantly: * Any test improvements or new tests that improve coverage are always welcome. * All other changes should have accompanying unit tests (see `src/test/`) or functional tests (see `test/`). Contributors should note which tests cover modified code. If no tests exist for a region of modified code, new tests should accompany the change. * Bug fixes are most welcome when they come with steps to reproduce or an explanation of the potential issue as well as reasoning for the way the bug was fixed. * Features are welcome, but might be rejected due to design or scope issues. If a feature is based on a lot of dependencies, contributors should first consider building the system outside of Bitcoin Core, if possible. * Refactoring changes are only accepted if they are required for a feature or bug fix or otherwise improve developer experience significantly. For example, most "code style" refactoring changes require a thorough explanation why they are useful, what downsides they have and why they *significantly* improve developer experience or avoid serious programming bugs. Note that code style is often a subjective matter. Unless they are explicitly mentioned to be preferred in the [developer notes](/doc/developer-notes.md), stylistic code changes are usually rejected. -->

    <!-- Bitcoin Core has a thorough review process and even the most trivial change needs to pass a lot of eyes and requires non-zero or even substantial time effort to review. There is a huge lack of active reviewers on the project, so patches often sit for a long time. -->

  2. net: properly handle PF_NOBAN in CConnman::Bind()
    `PF_DOWNLOAD` is `0b1000000` and
    `PF_NOBAN`    is `0b1010000`.
    
    This makes a check like `flags & PF_NOBAN` return `true` even if `flags`
    is equal to `PF_DOWNLOAD`.
    
    If `-whitebind=download@1.1.1.1:8765` is specified, then `1.1.1.1:8765`
    should be added to the list of local addresses. We only want to avoid
    adding to local addresses (that are advertised) a whitebind that has
    `noban@` flag.
    
    As a result of a mis-check in `CConnman::Bind()` we would not have added
    `1.1.1.1:8765` to the local addresses in the example above.
    d059b3a4c7
  3. vasild commented at 5:03 PM on April 13, 2021: member

    Similar issue spotted in #20196 (review) by @jonatack. I checked that what's fixed in this PR is the only other case.

    cc @hebasto, @NicolasDorier

  4. jonatack commented at 5:39 PM on April 13, 2021: member

    Proposed in #21644.

  5. jonatack commented at 5:41 PM on April 13, 2021: member

    (#21506 would eliminate this class of NetPermissionFlags bug as well, as only defined operations would compile.)

  6. DrahtBot added the label P2P on Apr 13, 2021
  7. DrahtBot commented at 11:54 PM on April 13, 2021: member

    <!--e57a25ab6845829454e8d69fc972939a-->

    The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.

    <!--174a7506f384e20aa4161008e828411d-->

    Conflicts

    Reviewers, this pull request conflicts with the following ones:

    • #21644 (p2p, bugfix: use NetPermissions::HasFlag() in CConnman::Bind() by jonatack)
    • #21506 (p2p, refactor: make NetPermissionFlags an enum class by jonatack)

    If you consider this pull request important, please also help to review the conflicting pull requests. Ideally, start with the one that should be merged first.

  8. vasild commented at 7:41 AM on April 14, 2021: member

    Closing in favor of #21644.

  9. vasild closed this on Apr 14, 2021

  10. vasild deleted the branch on Apr 14, 2021
  11. in src/net.cpp:2421 in d059b3a4c7
    2417 | @@ -2418,7 +2418,9 @@ bool CConnman::Bind(const CService &addr, unsigned int flags, NetPermissionFlags
    2418 |          return false;
    2419 |      }
    2420 |  
    2421 | -    if (addr.IsRoutable() && fDiscover && !(flags & BF_DONT_ADVERTISE) && !(permissions & PF_NOBAN)) {
    2422 | +    const bool noban{NetPermissions::HasFlag(static_cast<NetPermissionFlags>(flags), PF_NOBAN)};
    


    jonatack commented at 4:30 PM on April 14, 2021:

    I stared at this for a minute to figure out why the cast added. Then I realized it's because this line uses flags instead of permissions. The names are certainly similar enough to be confusing.


    vasild commented at 4:48 PM on April 14, 2021:

    Right, it is using the wrong variable :facepalm:


    MarcoFalke commented at 6:57 AM on May 12, 2021:

    Would be nice if there was a test that failed with this diff

  12. DrahtBot locked this on Aug 18, 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-04-17 09:14 UTC

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