added extra checks for socket accept

This commit is contained in:
hyunghwan.chung 2018-05-07 17:22:04 +00:00
parent 0a5896b16b
commit bd52dcf0bc
2 changed files with 20 additions and 5 deletions

View File

@ -493,7 +493,7 @@ class ServerSocket(Socket)
| cliaddr clisck cliact | | cliaddr clisck cliact |
cliaddr := SocketAddress new. cliaddr := SocketAddress new.
clisck := self _accept: cliaddr. clisck := self _accept: cliaddr.
if (clisck notError) if (clisck notNil)
{ {
## the _accept method doesn't invoke the initialize method. ## the _accept method doesn't invoke the initialize method.
## i should invoke it manually here. ## i should invoke it manually here.
@ -506,7 +506,6 @@ class ServerSocket(Socket)
clisck beWatched. clisck beWatched.
} }
else { clisck close }. else { clisck close }.
}. }.
]. ].
} }

View File

@ -218,22 +218,38 @@ static moo_pfrc_t pf_accept_socket (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs)
newfd = accept4(fd, (struct sockaddr*)MOO_OBJ_GET_BYTE_SLOT(arg), &addrlen, SOCK_NONBLOCK | SOCK_CLOEXEC); newfd = accept4(fd, (struct sockaddr*)MOO_OBJ_GET_BYTE_SLOT(arg), &addrlen, SOCK_NONBLOCK | SOCK_CLOEXEC);
if (newfd == -1) if (newfd == -1)
{ {
if (errno != ENOSYS) if (errno == ENOSYS) goto normal_accept;
if (errno != EWOULDBLOCK && errno != EAGAIN)
{ {
moo_seterrwithsyserr (moo, errno); moo_seterrwithsyserr (moo, errno);
return MOO_PF_FAILURE; return MOO_PF_FAILURE;
} }
/* return nil if accept() is not ready to accept a socket */
MOO_STACK_SETRET (moo, nargs, moo->_nil);
return MOO_PF_SUCCESS;
} }
else else
{ {
goto accept_done; goto accept_done;
} }
normal_accept:
#endif #endif
newfd = accept(fd, (struct sockaddr*)MOO_OBJ_GET_BYTE_SLOT(arg), &addrlen); newfd = accept(fd, (struct sockaddr*)MOO_OBJ_GET_BYTE_SLOT(arg), &addrlen);
if (newfd == -1) if (newfd == -1)
{ {
moo_seterrwithsyserr (moo, errno); if (errno != EWOULDBLOCK && errno != EAGAIN)
return MOO_PF_FAILURE; {
moo_seterrwithsyserr (moo, errno);
return MOO_PF_FAILURE;
}
/* return nil if accept() is not ready to accept a socket */
MOO_STACK_SETRET (moo, nargs, moo->_nil);
return MOO_PF_SUCCESS;
} }
fl = fcntl(newfd, F_GETFL, 0); fl = fcntl(newfd, F_GETFL, 0);
if (fl == -1) if (fl == -1)