diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2018-02-07 17:37:48 +0300 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2018-02-07 17:37:48 +0300 |
commit | 51af517cabcf2677f9ad1b8540dcd98f8e141928 (patch) | |
tree | cb2943dda4e5fd3b1d1be71e66ea86279b54f934 /winsup/cygwin/net.cc | |
parent | 2af67d21b2e4e1d657fe88fc42924cbebab64585 (diff) |
Cygwin: setsockopt/getsockopt: Add missing optlen checks
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'winsup/cygwin/net.cc')
-rw-r--r-- | winsup/cygwin/net.cc | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/winsup/cygwin/net.cc b/winsup/cygwin/net.cc index 9ff64b82e..6f96acbd2 100644 --- a/winsup/cygwin/net.cc +++ b/winsup/cygwin/net.cc @@ -842,6 +842,11 @@ cygwin_setsockopt (int fd, int level, int optname, const void *optval, SO_REUSEADDR has been set but don't call setsockopt. Instead fhandler_socket::bind sets SO_EXCLUSIVEADDRUSE if the application did not set SO_REUSEADDR. */ + if (optlen < (socklen_t) sizeof (int)) + { + set_errno (EINVAL); + __leave; + } if (fh->get_socket_type () == SOCK_STREAM) ignore = true; break; @@ -901,7 +906,7 @@ cygwin_setsockopt (int fd, int level, int optname, const void *optval, } } - if (optlen == sizeof (int)) + if (optlen == (socklen_t) sizeof (int)) debug_printf ("setsockopt optval=%x", *(int *) optval); /* Postprocessing setsockopt, setting fhandler_socket members, etc. */ @@ -966,7 +971,15 @@ cygwin_getsockopt (int fd, int level, int optname, void *optval, case SO_PEERCRED: { struct ucred *cred = (struct ucred *) optval; + + if (*optlen < (socklen_t) sizeof *cred) + { + set_errno (EINVAL); + __leave; + } res = fh->getpeereid (&cred->pid, &cred->uid, &cred->gid); + if (!res) + *optlen = (socklen_t) sizeof *cred; __leave; } break; @@ -974,8 +987,14 @@ cygwin_getsockopt (int fd, int level, int optname, void *optval, case SO_REUSEADDR: { unsigned int *reuseaddr = (unsigned int *) optval; + + if (*optlen < (socklen_t) sizeof *reuseaddr) + { + set_errno (EINVAL); + __leave; + } *reuseaddr = fh->saw_reuseaddr(); - *optlen = sizeof *reuseaddr; + *optlen = (socklen_t) sizeof *reuseaddr; ignore = true; } break; |