lwIP sockets: a UDP send crashes the VM when pbuf_alloc fails instead of returning an error
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
- 78/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, networking
Hướng nghiên cứu
Đọc src/libAtomVM/otp_socket.c tại do_socket_send, trong trường hợp SocketStateUDP của nhánh OTP_SOCKET_LWIP. Kiểm tra cách các lỗi socket lân cận được trả về và cách xử lý lỗi của pbuf_alloc. Thêm nhánh lỗi cho pbuf NULL để trả về lỗi socket phù hợp, sau đó xác minh rằng các lần gửi UDP quá lớn hoặc thiếu bộ nhớ sẽ trả về lỗi thay vì làm VM gặp sự cố.
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).
Not changed by #2345.
What happens
do_socket_send builds the datagram with:
struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);
uint8_t *bytes = (uint8_t *) p->payload;
memcpy(bytes, buf, len);
There is no NULL check. When lwIP cannot allocate the pbuf (payload larger than
the lwIP heap, or memory exhausted by a burst of datagrams), p is NULL and
the VM dereferences it: hard fault on the Pico W, instead of {error, Reason}.
How to reproduce (Pico W)
{ok, S} = socket:open(inet, dgram, udp),
Dest = #{family => inet, addr => {192, 168, 0, 1}, port => 5000},
socket:sendto(S, binary:copy(<<0>>, 60000), Dest). % larger than MEM_SIZE
The board faults. A tight loop of 1400-byte datagrams hits the same path once
the pbuf memory is exhausted.
Where
src/libAtomVM/otp_socket.c, do_socket_send, #elif OTP_SOCKET_LWIP branch,
SocketStateUDP case.
Suggested fix
Return SocketOtherError with ERR_MEM (or SocketWouldBlock, so that
socket:sendto/3 waits and retries) when pbuf_alloc returns NULL.
- 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
-
lwIP sockets: a failed listen or connect leaves the socket lock held, a later close hangs foreverĐang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 84/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ự
-
enhancement
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
-
Độ 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
-
快速入门那里会不会对新手不太友好,提出优化方案Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 66/100
-
follow-up Prio 📌
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/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 76/100
facebookincubator/muse-gadget-sdk#384 ·
Maintainer thường phản hồi trong vòng 5 ngày