lwIP sockets: a UDP send crashes the VM when pbuf_alloc fails instead of returning an error

Đang mở Phù hợp với người mới
#2,477 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

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

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 atomvm/AtomVM

Tất cả issue của atomvm/AtomVM

Issue tương tự

Thêm issue về Embedded & IoT

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.