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:
parent
53af7ebaf5
commit
83e2932eb6
@ -928,7 +928,7 @@ static ssize_t socket_sendto(socket_t *s, const void *buffer, size_t length,
|
|||||||
return res;
|
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)
|
if ((res = _sockaddr_to_ep(address, address_len, &ep)) < 0)
|
||||||
return res;
|
return res;
|
||||||
#endif
|
#endif
|
||||||
@ -959,7 +959,13 @@ static ssize_t socket_sendto(socket_t *s, const void *buffer, size_t length,
|
|||||||
#endif
|
#endif
|
||||||
#ifdef MODULE_SOCK_UDP
|
#ifdef MODULE_SOCK_UDP
|
||||||
case SOCK_DGRAM:
|
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;
|
errno = -res;
|
||||||
res = -1;
|
res = -1;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user