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