diff options
author | Ken Brown <kbrown@cornell.edu> | 2021-05-07 11:19:51 -0400 |
---|---|---|
committer | Ken Brown <kbrown@cornell.edu> | 2021-06-04 12:36:45 -0400 |
commit | 83b2ac199dc60a38b00776e29d6516cbf2a1f26c (patch) | |
tree | 076dbe5dd0dc8fb35bb7820c837f77bd1744b757 | |
parent | 700c140ba64925277e030d89e9622b6af1bdfc6b (diff) | |
download | newlib-83b2ac199dc60a38b00776e29d6516cbf2a1f26c.zip newlib-83b2ac199dc60a38b00776e29d6516cbf2a1f26c.tar.gz newlib-83b2ac199dc60a38b00776e29d6516cbf2a1f26c.tar.bz2 |
Cygwin: AF_UNIX: rework some internal methods
- open_abstract_link, open_reparse_point, and open_socket now return
HANDLEs
- connect no longer checks the validity of the sockaddr structure.
It's done in open_socket.
-rw-r--r-- | winsup/cygwin/fhandler.h | 6 | ||||
-rw-r--r-- | winsup/cygwin/fhandler_socket_unix.cc | 82 |
2 files changed, 37 insertions, 51 deletions
diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index 4613e0f..da40070 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -1086,9 +1086,9 @@ class fhandler_socket_unix : public fhandler_socket static HANDLE create_reparse_point (const sun_name_t *sun, const char *mqueue_name); HANDLE create_socket (const sun_name_t *sun); - static int open_abstract_link (sun_name_t *sun, char *mqueue_name); - static int open_reparse_point (sun_name_t *sun, char *mqueue_name); - static int open_socket (sun_name_t *sun, int &type, char *mqueue_name); + static HANDLE open_abstract_link (sun_name_t *sun, char *mqueue_name); + static HANDLE open_reparse_point (sun_name_t *sun, char *mqueue_name); + static HANDLE open_socket (sun_name_t *sun, int &type, char *mqueue_name); HANDLE autobind (sun_name_t *sun); char get_type_char (); void set_pipe_non_blocking (bool nonblocking); diff --git a/winsup/cygwin/fhandler_socket_unix.cc b/winsup/cygwin/fhandler_socket_unix.cc index 56ea13d..b7df318 100644 --- a/winsup/cygwin/fhandler_socket_unix.cc +++ b/winsup/cygwin/fhandler_socket_unix.cc @@ -419,7 +419,7 @@ fhandler_socket_unix::create_socket (const sun_name_t *sun) return create_reparse_point (sun, get_mqueue_name ()); } -int +HANDLE fhandler_socket_unix::open_abstract_link (sun_name_t *sun, char *mqueue_name) { @@ -439,7 +439,7 @@ fhandler_socket_unix::open_abstract_link (sun_name_t *sun, if (!NT_SUCCESS (status)) { __seterrno_from_nt_status (status); - return -1; + return NULL; } if (mqueue_name) { @@ -447,20 +447,20 @@ fhandler_socket_unix::open_abstract_link (sun_name_t *sun, MAX_PATH * sizeof (WCHAR)); status = NtQuerySymbolicLinkObject (fh, &umqueue_name, NULL); } - NtClose (fh); if (mqueue_name) { if (!NT_SUCCESS (status)) { + NtClose (fh); __seterrno_from_nt_status (status); - return -1; + return NULL; } sys_wcstombs (mqueue_name, MAX_PATH, wmqueue_name); } - return 0; + return fh; } -int +HANDLE fhandler_socket_unix::open_reparse_point (sun_name_t *sun, char *mqueue_name) { @@ -475,12 +475,12 @@ fhandler_socket_unix::open_reparse_point (sun_name_t *sun, if (pc.error) { set_errno (pc.error); - return -1; + return NULL; } if (!pc.exists ()) { set_errno (ENOENT); - return -1; + return NULL; } pc.get_object_attr (attr, sec_none_nih); do @@ -502,45 +502,47 @@ fhandler_socket_unix::open_reparse_point (sun_name_t *sun, && !_my_tls.call_signal_handler ()) { set_errno (EINTR); - return -1; + return NULL; } yield (); } else if (!NT_SUCCESS (status)) { __seterrno_from_nt_status (status); - return -1; + return NULL; } } while (status == STATUS_SHARING_VIOLATION); rp = (PREPARSE_GUID_DATA_BUFFER) tp.c_get (); status = NtFsControlFile (fh, NULL, NULL, NULL, &io, FSCTL_GET_REPARSE_POINT, NULL, 0, rp, MAXIMUM_REPARSE_DATA_BUFFER_SIZE); - NtClose (fh); if (rp->ReparseTag == IO_REPARSE_TAG_CYGUNIX && memcmp (CYGWIN_SOCKET_GUID, &rp->ReparseGuid, sizeof (GUID)) == 0) { if (mqueue_name) strcpy (mqueue_name, (char *) rp->GenericReparseBuffer.DataBuffer); - return 0; + return fh; } - return -1; + NtClose (fh); + return NULL; } -int +HANDLE fhandler_socket_unix::open_socket (sun_name_t *sun, int &type, char *mqueue_name) { - int ret = -1; + HANDLE fh = NULL; if (sun->un_len <= (socklen_t) sizeof (sa_family_t) || (sun->un_len == 3 && sun->un.sun_path[0] == '\0')) set_errno (EINVAL); + else if (sun->un.sun_family != AF_UNIX) + set_errno (EAFNOSUPPORT); else if (sun->un.sun_path[0] == '\0') - ret = open_abstract_link (sun, mqueue_name); + fh = open_abstract_link (sun, mqueue_name); else - ret = open_reparse_point (sun, mqueue_name); - if (!ret) + fh = open_reparse_point (sun, mqueue_name); + if (fh) switch (mqueue_name[CYGWIN_MQUEUE_SOCKET_TYPE_POS]) { case 'd': @@ -551,10 +553,11 @@ fhandler_socket_unix::open_socket (sun_name_t *sun, int &type, break; default: set_errno (EINVAL); - ret = -1; + NtClose (fh); + fh = NULL; break; } - return ret; + return fh; } HANDLE @@ -1681,6 +1684,7 @@ fhandler_socket_unix::connect (const struct sockaddr *name, int namelen) sun_name_t sun (name, namelen); int peer_type; char mqueue_name[CYGWIN_MQUEUE_SOCKET_NAME_LEN + 1]; + HANDLE fh = NULL; /* Test and set connection state. */ conn_lock (); @@ -1711,27 +1715,9 @@ fhandler_socket_unix::connect (const struct sockaddr *name, int namelen) } connect_state (connect_pending); conn_unlock (); - /* Check validity of name */ - if (sun.un_len <= (int) sizeof (sa_family_t)) - { - set_errno (EINVAL); - connect_state (unconnected); - return -1; - } - if (sun.un.sun_family != AF_UNIX) - { - set_errno (EAFNOSUPPORT); - connect_state (unconnected); - return -1; - } - if (sun.un_len == 3 && sun.un.sun_path[0] == '\0') - { - set_errno (EINVAL); - connect_state (unconnected); - return -1; - } /* Check if peer address exists. */ - if (open_socket (&sun, peer_type, mqueue_name) < 0) + fh = open_socket (&sun, peer_type, mqueue_name); + if (!fh) { connect_state (unconnected); return -1; @@ -1739,22 +1725,22 @@ fhandler_socket_unix::connect (const struct sockaddr *name, int namelen) if (peer_type != get_socket_type ()) { set_errno (EINVAL); + NtClose (fh); connect_state (unconnected); return -1; } peer_sun_path (&sun); - if (get_socket_type () != SOCK_DGRAM) + if (get_socket_type () != SOCK_DGRAM && connect_mqueue (mqueue_name) < 0) { - if (connect_mqueue (mqueue_name) < 0) + NtClose (fh); + if (get_errno () != EINPROGRESS) { - if (get_errno () != EINPROGRESS) - { - peer_sun_path (NULL); - connect_state (connect_failed); - } - return -1; + peer_sun_path (NULL); + connect_state (connect_failed); } + return -1; } + NtClose (fh); connect_state (connected); return 0; } |