Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2018-02-26 19:56:47 +0300
committerCorinna Vinschen <corinna@vinschen.de>2018-02-26 19:56:47 +0300
commitd35bd22992cc08d5c04ff822959bacd863abf41b (patch)
tree219a73d6eac68308904509f8cc1cc696139a129c /winsup/cygwin
parent1e5e44a9a5fa0b7f0bfc876f534221f709f01d66 (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.cc7
-rw-r--r--winsup/cygwin/fhandler_socket_local.cc20
-rw-r--r--winsup/cygwin/fhandler_socket_unix.cc20
-rw-r--r--winsup/cygwin/net.cc25
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: