added extra checks for socket accept
This commit is contained in:
		@ -493,7 +493,7 @@ class ServerSocket(Socket)
 | 
			
		||||
			| cliaddr clisck cliact |
 | 
			
		||||
			cliaddr := SocketAddress new.
 | 
			
		||||
			clisck := self _accept: cliaddr.
 | 
			
		||||
			if (clisck notError)
 | 
			
		||||
			if (clisck notNil)
 | 
			
		||||
			{
 | 
			
		||||
				## the _accept method doesn't invoke the initialize method.
 | 
			
		||||
				## i should invoke it manually here.
 | 
			
		||||
@ -506,7 +506,6 @@ class ServerSocket(Socket)
 | 
			
		||||
					clisck beWatched.
 | 
			
		||||
				}
 | 
			
		||||
				else { clisck close }.
 | 
			
		||||
	
 | 
			
		||||
			}.
 | 
			
		||||
		].
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
	if (newfd == -1)
 | 
			
		||||
	{
 | 
			
		||||
		if (errno != ENOSYS) 
 | 
			
		||||
		if (errno == ENOSYS) goto normal_accept;
 | 
			
		||||
		
 | 
			
		||||
		if (errno != EWOULDBLOCK && errno != EAGAIN) 
 | 
			
		||||
		{
 | 
			
		||||
			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;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		goto accept_done;
 | 
			
		||||
	}
 | 
			
		||||
normal_accept:
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	newfd = accept(fd, (struct sockaddr*)MOO_OBJ_GET_BYTE_SLOT(arg), &addrlen);
 | 
			
		||||
	if (newfd == -1)
 | 
			
		||||
	{
 | 
			
		||||
		moo_seterrwithsyserr (moo, errno);
 | 
			
		||||
		return MOO_PF_FAILURE;
 | 
			
		||||
		if (errno != EWOULDBLOCK && errno != EAGAIN)
 | 
			
		||||
		{
 | 
			
		||||
			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);
 | 
			
		||||
	if (fl == -1)
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user