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().
This commit is contained in:
Olaf Bergmann 2019-04-10 11:16:13 +02:00
parent 53af7ebaf5
commit 83e2932eb6

View File

@ -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;
}