lwIP sockets: a UDP send crashes the VM when pbuf_alloc fails instead of returning an error
Los mantenedores suelen responder en 3 días
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 78/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- c, erlang
- Área
- embedded-iot, networking
Línea de trabajo
Lee src/libAtomVM/otp_socket.c en do_socket_send, en el caso SocketStateUDP de la rama OTP_SOCKET_LWIP. Comprueba cómo se devuelven los errores de socket cercanos y cómo se manejan los fallos de pbuf_alloc. Añade una ruta de error para un pbuf NULL que devuelva un error de socket adecuado y, después, verifica que los envíos UDP demasiado grandes o con falta de memoria devuelvan un error en lugar de provocar un fallo de la VM.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
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.
- Lenguaje dominante
- Erlang
- Estrellas
- 2.3k
- Forks
- 171
- Merge medio
- 4 d 11 h
- PR fusionados (30 d)
- 20
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de atomvm/AtomVM
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 3 días
-
lwIP sockets: a failed listen or connect leaves the socket lock held, a later close hangs foreverAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
Los mantenedores suelen responder en 3 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
Los mantenedores suelen responder en 3 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
Los mantenedores suelen responder en 3 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 77/100
Los mantenedores suelen responder en 3 días
Todos los issues de atomvm/AtomVM
Issues similares
-
enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
micropython/micropython#19942 ·
Los mantenedores suelen responder en 1 día
-
快速入门那里会不会对新手不太友好,提出优化方案Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 66/100
-
follow-up Prio 📌
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
facebookincubator/muse-gadget-sdk#384 ·
Los mantenedores suelen responder en 5 días