diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2014-08-18 11:09:56 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2014-08-18 11:09:56 +0000 |
commit | 1091d4404ed9f4b20a0f45be20a9f8187d5db335 (patch) | |
tree | 3d6e9cad7ae9f250509bf0529149090b0fbb556d /winsup/cygwin/fhandler_socket.cc | |
parent | 7e46c0af626b5ac2fdd8051e8357ba461d3fdabf (diff) | |
download | cygnal-1091d4404ed9f4b20a0f45be20a9f8187d5db335.tar.gz cygnal-1091d4404ed9f4b20a0f45be20a9f8187d5db335.tar.bz2 cygnal-1091d4404ed9f4b20a0f45be20a9f8187d5db335.zip |
* dtable.cc (dtable::init_std_file_from_handle): Mention that console
handles are kernel objects since Windows 8.
* fhandler.h (enum conn_state): Add "listener" state.
(class fhandler_socket): Drop listener status flag.
(fhandler_socket::lseek): Return -1 and errno ESPIPE.
(fhandler_serial::lseek): Ditto.
* fhandler_socket.cc (fhandler_socket::listen): Set connect_state to
listener. Add comment.
(fhandler_socket::accept4): Explicitely check if the socket is listening
and fail with EINVAL, if not. Explain why we have to do that.
(fhandler_socket::recv_internal): Explicitely check if the socket is
connected if it's a stream socket. Explain why we have to do that.
(fhandler_socket::getpeereid): Drop now redundant test.
Diffstat (limited to 'winsup/cygwin/fhandler_socket.cc')
-rw-r--r-- | winsup/cygwin/fhandler_socket.cc | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc index 793578f39..779508b8c 100644 --- a/winsup/cygwin/fhandler_socket.cc +++ b/winsup/cygwin/fhandler_socket.cc @@ -1180,8 +1180,7 @@ fhandler_socket::listen (int backlog) { if (get_addr_family () == AF_LOCAL && get_socket_type () == SOCK_STREAM) af_local_set_cred (); - connect_state (connected); - listener (true); + connect_state (listener); /* gets set to connected on accepted socket. */ } else set_winsock_errno (); @@ -1195,7 +1194,17 @@ fhandler_socket::accept4 (struct sockaddr *peer, int *len, int flags) struct sockaddr_storage lpeer; int llen = sizeof (struct sockaddr_storage); - int res = 0; + int res = (int) INVALID_SOCKET; + + /* Windows event handling does not check for the validity of the desired + flags so we have to do it here. */ + if (connect_state () != listener) + { + WSASetLastError (WSAEINVAL); + set_winsock_errno (); + goto out; + } + while (!(res = wait_for_events (FD_ACCEPT | FD_CLOSE, 0)) && (res = ::accept (get_socket (), (struct sockaddr *) &lpeer, &llen)) == SOCKET_ERROR @@ -1392,6 +1401,15 @@ fhandler_socket::recv_internal (LPWSAMSG wsamsg, bool use_recvmsg) static NO_COPY LPFN_WSARECVMSG WSARecvMsg; int orig_namelen = wsamsg->namelen; + /* Windows event handling does not check for the validity of the desired + flags so we have to do it here. */ + if (get_socket_type () == SOCK_STREAM && connect_state () != connected) + { + WSASetLastError (WSAENOTCONN); + set_winsock_errno (); + return SOCKET_ERROR; + } + DWORD wait_flags = wsamsg->dwFlags; bool waitall = !!(wait_flags & MSG_WAITALL); wsamsg->dwFlags &= (MSG_OOB | MSG_PEEK | MSG_DONTROUTE); @@ -2264,12 +2282,6 @@ fhandler_socket::getpeereid (pid_t *pid, uid_t *euid, gid_t *egid) set_errno (ENOTCONN); return -1; } - if (sec_peer_pid == (pid_t) 0) - { - set_errno (ENOTCONN); /* Usually when calling getpeereid on - accepting (instead of accepted) socket. */ - return -1; - } myfault efault; if (efault.faulted (EFAULT)) |