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-07 17:37:48 +0300
committerCorinna Vinschen <corinna@vinschen.de>2018-02-07 17:37:48 +0300
commit51af517cabcf2677f9ad1b8540dcd98f8e141928 (patch)
treecb2943dda4e5fd3b1d1be71e66ea86279b54f934 /winsup/cygwin/net.cc
parent2af67d21b2e4e1d657fe88fc42924cbebab64585 (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.cc23
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;