From b4f06520f4da34dc909b3774103e17dc3c8034d8 Mon Sep 17 00:00:00 2001 From: Conrad Scott Date: Thu, 8 Aug 2002 17:03:20 +0000 Subject: * winsup.h (__check_null_invalid_struct): Make ptr argument non-const. (__check_null_invalid_struct_errno): Ditto. * miscfuncs.cc (__check_null_invalid_struct): Ditto. (__check_null_invalid_struct_errno): Ditto. (__check_invalid_read_ptr_errno): Remove superfluous cast. * net.cc (get): Set appropriate errno if fd is not a socket. (cygwin_sendto): Fix parameter checking. (cygwin_recvfrom): Ditto. (cygwin_setsockopt): Ditto. (cygwin_getsockopt): Ditto. (cygwin_connect): Ditto. (cygwin_gethostbyaddr): Ditto. (cygwin_accept): Ditto. (cygwin_bind): Ditto. (cygwin_getsockname): Ditto. (cygwin_listen): Ditto. (cygwin_getpeername): Ditto. (cygwin_send): Ditto. (cygwin_shutdown): Ditto. Move sigframe to fhandler_socket. (cygwin_recvmsg): Fix parameter checking. Add tracing. (cygwin_sendmsg): Ditto. * fhandler_socket.cc (fhandler_socket::shutdown): Add sigframe. * resource.cc (setrlimit): Fix parameter checking. --- winsup/cygwin/ChangeLog | 26 ++++ winsup/cygwin/fhandler_socket.cc | 2 + winsup/cygwin/miscfuncs.cc | 8 +- winsup/cygwin/net.cc | 299 ++++++++++++++++++++------------------- winsup/cygwin/resource.cc | 2 +- winsup/cygwin/winsup.h | 4 +- 6 files changed, 191 insertions(+), 150 deletions(-) (limited to 'winsup') diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 1a311dcac..cd7b70337 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,29 @@ +2002-08-07 Conrad Scott + + * winsup.h (__check_null_invalid_struct): Make ptr argument non-const. + (__check_null_invalid_struct_errno): Ditto. + * miscfuncs.cc (__check_null_invalid_struct): Ditto. + (__check_null_invalid_struct_errno): Ditto. + (__check_invalid_read_ptr_errno): Remove superfluous cast. + * net.cc (get): Set appropriate errno if fd is not a socket. + (cygwin_sendto): Fix parameter checking. + (cygwin_recvfrom): Ditto. + (cygwin_setsockopt): Ditto. + (cygwin_getsockopt): Ditto. + (cygwin_connect): Ditto. + (cygwin_gethostbyaddr): Ditto. + (cygwin_accept): Ditto. + (cygwin_bind): Ditto. + (cygwin_getsockname): Ditto. + (cygwin_listen): Ditto. + (cygwin_getpeername): Ditto. + (cygwin_send): Ditto. + (cygwin_shutdown): Ditto. Move sigframe to fhandler_socket. + (cygwin_recvmsg): Fix parameter checking. Add tracing. + (cygwin_sendmsg): Ditto. + * fhandler_socket.cc (fhandler_socket::shutdown): Add sigframe. + * resource.cc (setrlimit): Fix parameter checking. + 2002-08-08 Joe Buehler is_socket (); + fhandler_socket *const fh = cfd->is_socket (); + if (!fh) + set_errno (ENOTSOCK); + + return fh; } /* Cygwin internal */ @@ -567,7 +571,7 @@ cygwin_sendto (int fd, const void *buf, int len, unsigned int flags, fhandler_socket *fh = get (fd); if ((len && __check_invalid_read_ptr_errno (buf, (unsigned) len)) - || __check_null_invalid_struct_errno (to, tolen) + || (to &&__check_invalid_read_ptr_errno (to, tolen)) || !fh) res = -1; else @@ -587,8 +591,9 @@ cygwin_recvfrom (int fd, char *buf, int len, int flags, struct sockaddr *from, fhandler_socket *fh = get (fd); if (__check_null_invalid_struct_errno (buf, (unsigned) len) - || check_null_invalid_struct_errno (fromlen) - || (from && __check_null_invalid_struct_errno (from, (unsigned) *fromlen)) + || (from + && (check_null_invalid_struct_errno (fromlen) + ||__check_null_invalid_struct_errno (from, (unsigned) *fromlen))) || !fh) res = -1; else @@ -604,47 +609,49 @@ extern "C" int cygwin_setsockopt (int fd, int level, int optname, const void *optval, int optlen) { + int res; fhandler_socket *fh = get (fd); - int res = -1; const char *name = "error"; - if ((!optval || !__check_invalid_read_ptr_errno (optval, optlen)) && fh) + /* For the following debug_printf */ + switch (optname) { - /* For the following debug_printf */ - switch (optname) - { - case SO_DEBUG: - name="SO_DEBUG"; - break; - case SO_ACCEPTCONN: - name="SO_ACCEPTCONN"; - break; - case SO_REUSEADDR: - name="SO_REUSEADDR"; - break; - case SO_KEEPALIVE: - name="SO_KEEPALIVE"; - break; - case SO_DONTROUTE: - name="SO_DONTROUTE"; - break; - case SO_BROADCAST: - name="SO_BROADCAST"; - break; - case SO_USELOOPBACK: - name="SO_USELOOPBACK"; - break; - case SO_LINGER: - name="SO_LINGER"; - break; - case SO_OOBINLINE: - name="SO_OOBINLINE"; - break; - case SO_ERROR: - name="SO_ERROR"; - break; - } + case SO_DEBUG: + name="SO_DEBUG"; + break; + case SO_ACCEPTCONN: + name="SO_ACCEPTCONN"; + break; + case SO_REUSEADDR: + name="SO_REUSEADDR"; + break; + case SO_KEEPALIVE: + name="SO_KEEPALIVE"; + break; + case SO_DONTROUTE: + name="SO_DONTROUTE"; + break; + case SO_BROADCAST: + name="SO_BROADCAST"; + break; + case SO_USELOOPBACK: + name="SO_USELOOPBACK"; + break; + case SO_LINGER: + name="SO_LINGER"; + break; + case SO_OOBINLINE: + name="SO_OOBINLINE"; + break; + case SO_ERROR: + name="SO_ERROR"; + break; + } + if ((optval && __check_invalid_read_ptr_errno (optval, optlen)) || !fh) + res = -1; + else + { res = setsockopt (fh->get_socket (), level, optname, (const char *) optval, optlen); @@ -664,49 +671,52 @@ cygwin_setsockopt (int fd, int level, int optname, const void *optval, extern "C" int cygwin_getsockopt (int fd, int level, int optname, void *optval, int *optlen) { + int res; fhandler_socket *fh = get (fd); - int res = -1; const char *name = "error"; - if (!check_null_invalid_struct_errno (optlen) - && (!optval - || !__check_null_invalid_struct_errno (optval, (unsigned) *optlen)) - && fh) + + /* For the following debug_printf */ + switch (optname) { - /* For the following debug_printf */ - switch (optname) - { - case SO_DEBUG: - name="SO_DEBUG"; - break; - case SO_ACCEPTCONN: - name="SO_ACCEPTCONN"; - break; - case SO_REUSEADDR: - name="SO_REUSEADDR"; - break; - case SO_KEEPALIVE: - name="SO_KEEPALIVE"; - break; - case SO_DONTROUTE: - name="SO_DONTROUTE"; - break; - case SO_BROADCAST: - name="SO_BROADCAST"; - break; - case SO_USELOOPBACK: - name="SO_USELOOPBACK"; - break; - case SO_LINGER: - name="SO_LINGER"; - break; - case SO_OOBINLINE: - name="SO_OOBINLINE"; - break; - case SO_ERROR: - name="SO_ERROR"; - break; - } + case SO_DEBUG: + name="SO_DEBUG"; + break; + case SO_ACCEPTCONN: + name="SO_ACCEPTCONN"; + break; + case SO_REUSEADDR: + name="SO_REUSEADDR"; + break; + case SO_KEEPALIVE: + name="SO_KEEPALIVE"; + break; + case SO_DONTROUTE: + name="SO_DONTROUTE"; + break; + case SO_BROADCAST: + name="SO_BROADCAST"; + break; + case SO_USELOOPBACK: + name="SO_USELOOPBACK"; + break; + case SO_LINGER: + name="SO_LINGER"; + break; + case SO_OOBINLINE: + name="SO_OOBINLINE"; + break; + case SO_ERROR: + name="SO_ERROR"; + break; + } + if ((optval + && (check_null_invalid_struct_errno (optlen) + || __check_null_invalid_struct_errno (optval, (unsigned) *optlen))) + || !fh) + res = -1; + else + { res = getsockopt (fh->get_socket (), level, optname, (char *) optval, (int *) optlen); @@ -732,10 +742,7 @@ cygwin_connect (int fd, const struct sockaddr *name, int namelen) int res; fhandler_socket *fh = get (fd); - if (__check_invalid_read_ptr_errno (name, namelen)) - return -1; - - if (!fh) + if (__check_invalid_read_ptr_errno (name, namelen) || !fh) res = -1; else res = fh->connect (name, namelen); @@ -970,7 +977,7 @@ cygwin_gethostbyname (const char *name) extern "C" struct hostent * cygwin_gethostbyaddr (const char *addr, int len, int type) { - if (__check_null_invalid_struct_errno (addr, len)) + if (__check_invalid_read_ptr_errno (addr, len)) return NULL; free_hostent_ptr (hostent_buf); @@ -992,15 +999,14 @@ cygwin_gethostbyaddr (const char *addr, int len, int type) extern "C" int cygwin_accept (int fd, struct sockaddr *peer, int *len) { - if (peer != NULL - && (check_null_invalid_struct_errno (len) - || __check_null_invalid_struct_errno (peer, (unsigned) *len))) - return -1; - - int res = -1; - + int res; fhandler_socket *fh = get (fd); - if (fh) + + if ((peer && (check_null_invalid_struct_errno (len) + || __check_null_invalid_struct_errno (peer, (unsigned) *len))) + || !fh) + res = -1; + else res = fh->accept (peer, len); syscall_printf ("%d = accept (%d, %x, %x)", res, fd, peer, len); @@ -1011,13 +1017,12 @@ cygwin_accept (int fd, struct sockaddr *peer, int *len) extern "C" int cygwin_bind (int fd, const struct sockaddr *my_addr, int addrlen) { - if (__check_null_invalid_struct_errno (my_addr, addrlen)) - return -1; - - int res = -1; - + int res; fhandler_socket *fh = get (fd); - if (fh) + + if (__check_invalid_read_ptr_errno (my_addr, addrlen) || !fh) + res = -1; + else res = fh->bind (my_addr, addrlen); syscall_printf ("%d = bind (%d, %x, %d)", res, fd, my_addr, addrlen); @@ -1028,14 +1033,14 @@ cygwin_bind (int fd, const struct sockaddr *my_addr, int addrlen) extern "C" int cygwin_getsockname (int fd, struct sockaddr *addr, int *namelen) { - if (check_null_invalid_struct_errno (namelen) - || __check_null_invalid_struct_errno (addr, (unsigned) *namelen)) - return -1; - - int res = -1; - + int res; fhandler_socket *fh = get (fd); - if (fh) + + if (check_null_invalid_struct_errno (namelen) + || __check_null_invalid_struct_errno (addr, (unsigned) *namelen) + || !fh) + res = -1; + else res = fh->getsockname (addr, namelen); syscall_printf ("%d = getsockname (%d, %x, %d)", res, fd, addr, namelen); @@ -1046,10 +1051,12 @@ cygwin_getsockname (int fd, struct sockaddr *addr, int *namelen) extern "C" int cygwin_listen (int fd, int backlog) { - int res = -1; - + int res; fhandler_socket *fh = get (fd); - if (fh) + + if (!fh) + res = -1; + else res = fh->listen (backlog); syscall_printf ("%d = listen (%d, %d)", res, fd, backlog); @@ -1060,11 +1067,12 @@ cygwin_listen (int fd, int backlog) extern "C" int cygwin_shutdown (int fd, int how) { - int res = -1; - sigframe thisframe (mainthread); - + int res; fhandler_socket *fh = get (fd); - if (fh) + + if (!fh) + res = -1; + else res = fh->shutdown (how); syscall_printf ("%d = shutdown (%d, %d)", res, fd, how); @@ -1122,18 +1130,17 @@ cygwin_herror (const char *s) extern "C" int cygwin_getpeername (int fd, struct sockaddr *name, int *len) { - int res = -1; + int res; + fhandler_socket *fh = get (fd); if (check_null_invalid_struct_errno (len) - || __check_null_invalid_struct_errno (name, (unsigned) *len)) - return -1; - - fhandler_socket *fh = get (fd); - if (fh) + || __check_null_invalid_struct_errno (name, (unsigned) *len) + || !fh) + res = -1; + else res = fh->getpeername (name, len); syscall_printf ("%d = getpeername %d", res, (fh ? fh->get_socket () : -1)); - return res; } @@ -1150,7 +1157,6 @@ cygwin_recv (int fd, void *buf, int len, unsigned int flags) res = fh->recv (buf, len, flags); syscall_printf ("%d = recv (%d, %x, %x, %x)", res, fd, buf, len, flags); - return res; } @@ -1161,13 +1167,12 @@ cygwin_send (int fd, const void *buf, int len, unsigned int flags) int res; fhandler_socket *fh = get (fd); - if (__check_invalid_read_ptr_errno (buf, len) || !fh) + if ((len &&__check_invalid_read_ptr_errno (buf, len)) || !fh) res = -1; else res = fh->send (buf, len, flags); syscall_printf ("%d = send (%d, %x, %d, %x)", res, fd, buf, len, flags); - return res; } @@ -2095,32 +2100,40 @@ endhostent (void) /* exported as recvmsg: standards? */ extern "C" int -cygwin_recvmsg (int s, struct msghdr *msg, int flags) +cygwin_recvmsg (int fd, struct msghdr *msg, int flags) { - if (check_null_invalid_struct_errno (msg)) - return -1; + int res; + fhandler_socket *fh = get (fd); - fhandler_socket *fh = get (s); - if (!fh) - { - set_errno (EINVAL); - return -1; - } - return fh->recvmsg (msg, flags); + if (check_null_invalid_struct_errno (msg) + || (msg->msg_name + && __check_null_invalid_struct_errno (msg->msg_name, + (unsigned) msg->msg_namelen)) + || !fh) + res = -1; + else + res = fh->recvmsg (msg, flags); + + syscall_printf ("%d = recvmsg (%d, %x, %x)", res, fd, msg, flags); + return res; } /* exported as sendmsg: standards? */ extern "C" int -cygwin_sendmsg (int s, const struct msghdr *msg, int flags) +cygwin_sendmsg (int fd, const struct msghdr *msg, int flags) { - if (__check_invalid_read_ptr_errno (msg, sizeof msg)) - return -1; + int res; + fhandler_socket *fh = get (fd); - fhandler_socket *fh = get (s); - if (!fh) - { - set_errno (EINVAL); - return -1; - } - return fh->sendmsg (msg, flags); + if (__check_invalid_read_ptr_errno (msg, sizeof msg) + || (msg->msg_name + && __check_invalid_read_ptr_errno (msg->msg_name, + (unsigned) msg->msg_namelen)) + || !fh) + res = -1; + else + res = fh->sendmsg (msg, flags); + + syscall_printf ("%d = recvmsg (%d, %x, %x)", res, fd, msg, flags); + return res; } diff --git a/winsup/cygwin/resource.cc b/winsup/cygwin/resource.cc index 8d9887158..cd2962d56 100644 --- a/winsup/cygwin/resource.cc +++ b/winsup/cygwin/resource.cc @@ -157,7 +157,7 @@ getrlimit (int resource, struct rlimit *rlp) extern "C" int setrlimit (int resource, const struct rlimit *rlp) { - if (check_null_invalid_struct_errno (rlp)) + if (__check_invalid_read_ptr_errno (rlp, sizeof (*rlp))) return -1; struct rlimit oldlimits; diff --git a/winsup/cygwin/winsup.h b/winsup/cygwin/winsup.h index 513d44863..433fc9944 100644 --- a/winsup/cygwin/winsup.h +++ b/winsup/cygwin/winsup.h @@ -212,8 +212,8 @@ int __stdcall check_null_str (const char *name) __attribute__ ((regparm(1))); int __stdcall check_null_empty_str (const char *name) __attribute__ ((regparm(1))); int __stdcall check_null_empty_str_errno (const char *name) __attribute__ ((regparm(1))); int __stdcall check_null_str_errno (const char *name) __attribute__ ((regparm(1))); -int __stdcall __check_null_invalid_struct (const void *s, unsigned sz) __attribute__ ((regparm(2))); -int __stdcall __check_null_invalid_struct_errno (const void *s, unsigned sz) __attribute__ ((regparm(2))); +int __stdcall __check_null_invalid_struct (void *s, unsigned sz) __attribute__ ((regparm(2))); +int __stdcall __check_null_invalid_struct_errno (void *s, unsigned sz) __attribute__ ((regparm(2))); int __stdcall __check_invalid_read_ptr_errno (const void *s, unsigned sz) __attribute__ ((regparm(2))); #define check_null_invalid_struct(s) \ -- cgit v1.2.3