From 83e2932eb6580e4777a74c1742a892e3993f45f8 Mon Sep 17 00:00:00 2001 From: Olaf Bergmann Date: Wed, 10 Apr 2019 11:16:13 +0200 Subject: [PATCH] posix_sockets.c: fix send()/write() for connected UDP sockets Calling send() or write() on a connected UDP socket raises a kernel panic in posix_sockets.c, line 215, because _sockaddr_to_ep() is called from socket_sendto() with address set to NULL. This change modifies socket_sendto() to * Check if the UDP socket is connected when the address argument is NULL. * If connected, use the stored remote endpoint for sock_udp_send(). --- sys/posix/sockets/posix_sockets.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/sys/posix/sockets/posix_sockets.c b/sys/posix/sockets/posix_sockets.c index ae7195b323..4b17b3904a 100644 --- a/sys/posix/sockets/posix_sockets.c +++ b/sys/posix/sockets/posix_sockets.c @@ -928,7 +928,7 @@ static ssize_t socket_sendto(socket_t *s, const void *buffer, size_t length, return res; } } -#if defined(MODULE_SOCK_IP) || defined(MODULE_SOCK_UDP) +#if defined(MODULE_SOCK_IP) if ((res = _sockaddr_to_ep(address, address_len, &ep)) < 0) return res; #endif @@ -959,7 +959,13 @@ static ssize_t socket_sendto(socket_t *s, const void *buffer, size_t length, #endif #ifdef MODULE_SOCK_UDP case SOCK_DGRAM: - if ((res = sock_udp_send(&s->sock->udp, buffer, length, &ep)) < 0) { + if (address == NULL) { + res = sock_udp_get_remote(&s->sock->udp, &ep); + } else { + res = _sockaddr_to_ep(address, address_len, &ep); + } + if ((res < 0) || + (res = sock_udp_send(&s->sock->udp, buffer, length, &ep)) < 0) { errno = -res; res = -1; }