diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2018-02-26 19:56:47 +0300 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2018-02-26 19:56:47 +0300 |
commit | d35bd22992cc08d5c04ff822959bacd863abf41b (patch) | |
tree | 219a73d6eac68308904509f8cc1cc696139a129c /winsup/cygwin | |
parent | 1e5e44a9a5fa0b7f0bfc876f534221f709f01d66 (diff) |
Cygwin: sockets: move type and proto checks into fhandler_socket classes
Encapsulation required
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'winsup/cygwin')
-rw-r--r-- | winsup/cygwin/fhandler_socket_inet.cc | 7 | ||||
-rw-r--r-- | winsup/cygwin/fhandler_socket_local.cc | 20 | ||||
-rw-r--r-- | winsup/cygwin/fhandler_socket_unix.cc | 20 | ||||
-rw-r--r-- | winsup/cygwin/net.cc | 25 |
4 files changed, 47 insertions, 25 deletions
diff --git a/winsup/cygwin/fhandler_socket_inet.cc b/winsup/cygwin/fhandler_socket_inet.cc index 42a3bd265..b0dc6581c 100644 --- a/winsup/cygwin/fhandler_socket_inet.cc +++ b/winsup/cygwin/fhandler_socket_inet.cc @@ -708,6 +708,13 @@ fhandler_socket_inet::socket (int af, int type, int protocol, int flags) SOCKET sock; int ret; + /* This test should be covered by ::socket, but make sure we don't + accidentally try anything else. */ + if (type != SOCK_STREAM && type != SOCK_DGRAM && type != SOCK_RAW) + { + set_errno (EINVAL); + return -1; + } sock = ::socket (af, type, protocol); if (sock == INVALID_SOCKET) { diff --git a/winsup/cygwin/fhandler_socket_local.cc b/winsup/cygwin/fhandler_socket_local.cc index d88476d1c..ad2df6568 100644 --- a/winsup/cygwin/fhandler_socket_local.cc +++ b/winsup/cygwin/fhandler_socket_local.cc @@ -241,6 +241,16 @@ fhandler_socket_local::socket (int af, int type, int protocol, int flags) SOCKET sock; int ret; + if (type != SOCK_STREAM && type != SOCK_DGRAM) + { + set_errno (EINVAL); + return -1; + } + if (protocol != 0) + { + set_errno (EPROTONOSUPPORT); + return -1; + } sock = ::socket (AF_INET, type, protocol); if (sock == INVALID_SOCKET) { @@ -265,6 +275,16 @@ fhandler_socket_local::socketpair (int af, int type, int protocol, int flags, fhandler_socket_local *fh_out = reinterpret_cast<fhandler_socket_local *> (_fh_out); + if (type != SOCK_STREAM && type != SOCK_DGRAM) + { + set_errno (EINVAL); + return -1; + } + if (protocol != 0) + { + set_errno (EPROTONOSUPPORT); + return -1; + } /* create listening socket */ sock = ::socket (AF_INET, type, 0); if (sock == INVALID_SOCKET) diff --git a/winsup/cygwin/fhandler_socket_unix.cc b/winsup/cygwin/fhandler_socket_unix.cc index 48d0d4c54..1e4d33901 100644 --- a/winsup/cygwin/fhandler_socket_unix.cc +++ b/winsup/cygwin/fhandler_socket_unix.cc @@ -229,6 +229,16 @@ fhandler_socket_unix::dup (fhandler_base *child, int flags) int fhandler_socket_unix::socket (int af, int type, int protocol, int flags) { + if (type != SOCK_STREAM && type != SOCK_DGRAM) + { + set_errno (EINVAL); + return -1; + } + if (protocol != 0) + { + set_errno (EPROTONOSUPPORT); + return -1; + } set_errno (EAFNOSUPPORT); return -1; } @@ -237,6 +247,16 @@ int fhandler_socket_unix::socketpair (int af, int type, int protocol, int flags, fhandler_socket *fh_out) { + if (type != SOCK_STREAM && type != SOCK_DGRAM) + { + set_errno (EINVAL); + return -1; + } + if (protocol != 0) + { + set_errno (EPROTONOSUPPORT); + return -1; + } set_errno (EAFNOSUPPORT); return -1; } diff --git a/winsup/cygwin/net.cc b/winsup/cygwin/net.cc index bd0a169dd..4fcc577bb 100644 --- a/winsup/cygwin/net.cc +++ b/winsup/cygwin/net.cc @@ -517,25 +517,10 @@ cygwin_socket (int af, int type, int protocol) { case AF_LOCAL: case AF_UNIX: - if (type != SOCK_STREAM && type != SOCK_DGRAM) - { - set_errno (EINVAL); - goto done; - } - if (protocol != 0) - { - set_errno (EPROTONOSUPPORT); - goto done; - } dev = (af == AF_LOCAL) ? af_local_dev : af_unix_dev; break; case AF_INET: case AF_INET6: - if (type != SOCK_STREAM && type != SOCK_DGRAM && type != SOCK_RAW) - { - set_errno (EINVAL); - goto done; - } dev = af_inet_dev; break; default: @@ -2314,16 +2299,6 @@ socketpair (int af, int type, int protocol, int *sb) { case AF_LOCAL: case AF_UNIX: - if (type != SOCK_STREAM && type != SOCK_DGRAM) - { - set_errno (EINVAL); - goto done; - } - if (protocol != 0) - { - set_errno (EPROTONOSUPPORT); - goto done; - } dev = (af == AF_LOCAL) ? af_local_dev : af_unix_dev; break; default: |