diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2016-03-31 06:38:37 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2016-03-31 06:38:37 -0700 |
commit | 7c3a6b3991a9b57377087c18375f60d68512b17e (patch) | |
tree | 6fcc65bc164c4d7642b6dcb57111477ebc392de5 | |
parent | b8e5ade6282798f705bf417fc5d92fcdd811de98 (diff) | |
download | txr-7c3a6b3991a9b57377087c18375f60d68512b17e.tar.gz txr-7c3a6b3991a9b57377087c18375f60d68512b17e.tar.bz2 txr-7c3a6b3991a9b57377087c18375f60d68512b17e.zip |
sock-set-peer shouldn't mark dgram sockets connected.
Merely setting a peer doesn't actually connect the socket,
so it must not be marked connected. If it is wrongly
marked connected, then dgram_flush will wrongly use
send rather than sendto.
* socket.c (dgram_set_sock_peer): Don't set sock_connected
flag.
(sock_connect): Set the sock_connected flag here, for dgram
sockets.
-rw-r--r-- | socket.c | 6 |
1 files changed, 5 insertions, 1 deletions
@@ -602,7 +602,6 @@ static val dgram_set_sock_peer(val stream, val peer) { struct dgram_stream *d = coerce(struct dgram_stream *, stream->co.handle); sockaddr_pack(peer, d->family, &d->peer_addr, &d->pa_len); - d->sock_connected = 1; return set(mkloc(d->peer, stream), peer); } @@ -736,6 +735,11 @@ static val sock_connect(val sock, val sockaddr, val timeout) sock_set_peer(sock, sockaddr); + if (sock_type(sock) == num_fast(SOCK_DGRAM)) { + struct dgram_stream *d = coerce(struct dgram_stream *, sock->co.handle); + d->sock_connected = 1; + } + return sock; } |