Make simulated WFP flow-context removal atomic and idempotent

Đang mở
#345 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

Đánh giá

Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức phù hợp với người mới
42/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
cpp
Lĩnh vực
networking

Hướng nghiên cứu

Start with fwp_engine_t::test_remove_flow_context and delete_flow_context, where the shared-lock lookup of fwpm_flow_contexts is released before the exclusive-lock erase. Make find-and-erase one exclusive-lock section, copy the callback inputs, then call flowDeleteFn after unlocking. Done means concurrent removers invoke it at most once, absent entries return a defined status, and a concurrency test covers FwpsFlowRemoveContext0 against simulated deletion.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

Problem

fwp_engine_t::test_remove_flow_context checks fwpm_flow_contexts under a shared lock, releases the lock, and then calls delete_flow_context, which reacquires an exclusive lock. Two concurrent removers can both observe the association. The winner erases it; the loser then finds no entry, asserts that the callout is non-null, and can invoke flowDeleteFn through a null pointer.

This occurs when simulated external flow deletion races with FwpsFlowRemoveContext during callout cleanup.

Originating review: https://github.com/microsoft/ebpf-for-windows/pull/5623#discussion_r4458625427

Desired behavior

Finding and claiming a flow-context association must be one atomic operation. Exactly one remover should own the association and invoke flowDeleteFn; later removers should receive a safe already-removed/not-found result.

The callback must still run after releasing the engine lock.

Acceptance criteria

  • Find-and-erase of fwpm_flow_contexts occurs under one exclusive lock.
  • The winning remover copies all callback inputs before releasing the lock.
  • flowDeleteFn is invoked outside the engine lock and at most once per association.
  • Missing or already-removed associations return a defined status/no-op without assertions or null dereferences.
  • FwpsFlowRemoveContext0 reports an appropriate status for an absent association.
  • A concurrency test runs cleanup removal and simulated flow deletion against the same flow.
Ngôn ngữ chính
C++
Star
112
Fork
36
Merge trung bình
8 ngày 10 giờ
Pull request đã merge (30 ngày)
6

Chuẩn bị môi trường

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của microsoft/usersim

Tất cả issue của microsoft/usersim

Issue tương tự

Thêm issue về C++

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.