diff options
author | unknown <diego.nehab@gmail.com> | 2013-05-28 00:09:30 +0800 |
---|---|---|
committer | unknown <diego.nehab@gmail.com> | 2013-05-28 00:09:30 +0800 |
commit | 734cc23e1f03372314ebad07ffd35117c152afcd (patch) | |
tree | 808531d9c0c84aae57657aff353b08d466a3dcfb /src/wsocket.c | |
parent | 66cd8cfcee1f14b59450147c16a6bc44ef298edc (diff) | |
download | luasocket-734cc23e1f03372314ebad07ffd35117c152afcd.tar.gz luasocket-734cc23e1f03372314ebad07ffd35117c152afcd.tar.bz2 luasocket-734cc23e1f03372314ebad07ffd35117c152afcd.zip |
Fixed inet_pton and a new Winsock UDP bug.
inet_pton was copying the entire sockaddr_in struct,
rather than just the sin_addr field...
I am a bit unsure about the UDP fix, because it may affect
TCP as well. On UDP sockets, when a sendto fails, the next
receive/receivefrom fails with CONNRESET. I changed
sock_recv/sock_recvfrom in wsocket.c to skip the CONNRESET
from the recv/recvfrom, hoping that if the socket is TCP,
sock_waitfd will get the CONNRESET again. The tests pass,
but this should be tested more thoroughly.
Diffstat (limited to 'src/wsocket.c')
-rw-r--r-- | src/wsocket.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/src/wsocket.c b/src/wsocket.c index 65f76bc..d34724b 100644 --- a/src/wsocket.c +++ b/src/wsocket.c | |||
@@ -250,7 +250,11 @@ int socket_recv(p_socket ps, char *data, size_t count, size_t *got, p_timeout tm | |||
250 | } | 250 | } |
251 | if (taken == 0) return IO_CLOSED; | 251 | if (taken == 0) return IO_CLOSED; |
252 | err = WSAGetLastError(); | 252 | err = WSAGetLastError(); |
253 | if (err != WSAEWOULDBLOCK) return err; | 253 | /* On Windows, and on UDP, a connreset simply means the |
254 | * previous send failed. On TCP, it means our socket | ||
255 | * is now useless, so the error must pass. I am | ||
256 | * hoping waitfd will still get the error. */ | ||
257 | if (err != WSAEWOULDBLOCK && err != WSAECONNRESET) return err; | ||
254 | if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err; | 258 | if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err; |
255 | } | 259 | } |
256 | } | 260 | } |
@@ -271,7 +275,11 @@ int socket_recvfrom(p_socket ps, char *data, size_t count, size_t *got, | |||
271 | } | 275 | } |
272 | if (taken == 0) return IO_CLOSED; | 276 | if (taken == 0) return IO_CLOSED; |
273 | err = WSAGetLastError(); | 277 | err = WSAGetLastError(); |
274 | if (err != WSAEWOULDBLOCK) return err; | 278 | /* On Windows, and on UDP, a connreset simply means the |
279 | * previous send failed. On TCP, it means our socket | ||
280 | * is now useless, so the error must pass. I am | ||
281 | * hoping waitfd will still get the error. */ | ||
282 | if (err != WSAEWOULDBLOCK && err != WSAECONNRESET) return err; | ||
275 | if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err; | 283 | if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err; |
276 | } | 284 | } |
277 | } | 285 | } |