lwIP sockets: a failed listen or connect leaves the socket lock held, a later close hangs forever
Maintainer thường phản hồi trong vòng 3 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 2/5
- Thời gian dự kiến
- 1-3 giờ
- Mức phù hợp với người mới
- 84/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ệ
- c, erlang
- Lĩnh vực
- embedded-iot
Hướng nghiên cứu
Bắt đầu tại src/libAtomVM/otp_socket.c và đọc nif_socket_listen cùng nhánh lwIP của nif_socket_connect. Kiểm tra cách #2345 xử lý khóa socket trên đường dẫn lỗi của tcp_close, sau đó tái hiện lỗi listen hoặc connect trên bản dựng SMP RP2. Hoàn tất khi mỗi đường dẫn lỗi giải phóng khóa đọc và socket:close trả về sau khi xảy ra lỗi.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Affected: release-0.7 at ca1583068, lwIP socket backend (RP2 port), SMP builds
(the default on RP2). Not changed by #2345.
What happens
nif_socket_listen and nif_socket_connect take the socket read lock, then
return on an lwIP error without releasing it:
nif_socket_listen:if (new_pcb == NULL) { return make_lwip_err_tuple(err, ctx); }nif_socket_connect(lwIP branch):if (err != ERR_OK) { ... return {error, closed} / RAISE_ERROR(...) }
The read lock is never released. Every later operation that takes the write lock
on that socket blocks forever and pins a scheduler thread: socket:close/1,
socket:recv/1,2,3, socket:accept/1,2, socket:send/2 (through the select
NIFs) and the monitor callback socket_down.
How to reproduce (Pico W)
Connect, with the network down or no route to the address (tcp_connect fails
with ERR_RTE):
{ok, S} = socket:open(inet, stream, tcp),
{error, closed} = socket:connect(S, #{family => inet, addr => {192, 168, 0, 1}, port => 80}),
ok = socket:close(S). % never returns
Listen on a socket that is already connected (tcp_listen fails with ERR_CLSD):
{error, _} = socket:listen(ConnectedSocket),
ok = socket:close(ConnectedSocket). % never returns
Where
src/libAtomVM/otp_socket.c, nif_socket_listen and nif_socket_connect,
#elif OTP_SOCKET_LWIP branches.
Suggested fix
SMP_RWLOCK_UNLOCK(rsrc_obj->socket_lock) before returning on both error
paths, as #2345 did for the failing tcp_close in nif_socket_close.
- Ngôn ngữ chính
- Erlang
- Star
- 2.3k
- Fork
- 171
- Merge trung bình
- 4 ngày 11 giờ
- Pull request đã merge (30 ngày)
- 20
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- 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.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của atomvm/AtomVM
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
Maintainer thường phản hồi trong vòng 3 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
Maintainer thường phản hồi trong vòng 3 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
Maintainer thường phản hồi trong vòng 3 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
Maintainer thường phản hồi trong vòng 3 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 77/100
Maintainer thường phản hồi trong vòng 3 ngày
Tất cả issue của atomvm/AtomVM
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
FujiNetWIFI/fujinet-firmware#2365 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
zigpy/zigpy#1965 · 3 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
enhancement
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
-
config ⚙
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
micropython/micropython#19942 ·
Maintainer thường phản hồi trong vòng 1 ngày