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

Abierto Apto para principiantes
#2,477 0 comentarios 0 reacciones 0 asignados Ver en GitHub

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

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

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de atomvm/AtomVM

Todos los issues de atomvm/AtomVM

Issues similares

Más issues de Embedded & IoT

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.