diff --git a/winsup/cygwin/fhandler_socket_unix.cc b/winsup/cygwin/fhandler_socket_unix.cc index c00d75362..4eed7e2af 100644 --- a/winsup/cygwin/fhandler_socket_unix.cc +++ b/winsup/cygwin/fhandler_socket_unix.cc @@ -106,31 +106,63 @@ class af_unix_pkt_hdr_t } }; -#define AF_UNIX_PKT_OFFSETOF_NAME(phdr) \ - (sizeof (af_unix_pkt_hdr_t)) -#define AF_UNIX_PKT_OFFSETOF_CMSG(phdr) \ - (sizeof (af_unix_pkt_hdr_t) + (phdr)->name_len) -#define AF_UNIX_PKT_OFFSETOF_DATA(phdr) \ - ({ \ - af_unix_pkt_hdr_t *_p = phdr; \ - sizeof (af_unix_pkt_hdr_t) + (_p)->name_len + (_p)->cmsg_len; \ - }) -#define AF_UNIX_PKT_NAME(phdr) \ - ({ \ - af_unix_pkt_hdr_t *_p = phdr; \ - (struct sockaddr_un *)(((PBYTE)(_p)) \ - + AF_UNIX_PKT_OFFSETOF_NAME (_p)); \ - }) -#define AF_UNIX_PKT_CMSG(phdr) \ - ({ \ - af_unix_pkt_hdr_t *_p = phdr; \ - (struct cmsghdr *)(((PBYTE)(_p)) + AF_UNIX_PKT_OFFSETOF_CMSG (_p)); \ - }) -#define AF_UNIX_PKT_DATA(phdr) \ - ({ \ - af_unix_pkt_hdr_t _p = phdr; \ - (void *)(((PBYTE)(_p)) + AF_UNIX_PKT_OFFSETOF_DATA (_p)); \ - }) +#define MAX_AF_UN_PKT_LEN UINT16_MAX + +static inline ptrdiff_t +AF_UNIX_PKT_OFFSETOF_NAME (af_unix_pkt_hdr_t *phdr) +{ + return sizeof (af_unix_pkt_hdr_t); +} + +static inline ptrdiff_t +AF_UNIX_PKT_OFFSETOF_CMSG (af_unix_pkt_hdr_t *phdr) +{ + return AF_UNIX_PKT_OFFSETOF_NAME (phdr) + phdr->name_len; +} + +static inline ptrdiff_t +AF_UNIX_PKT_OFFSETOF_DATA (af_unix_pkt_hdr_t *phdr) +{ + return AF_UNIX_PKT_OFFSETOF_CMSG (phdr) + phdr->cmsg_len; +} + +static inline struct sockaddr_un * +AF_UNIX_PKT_NAME (af_unix_pkt_hdr_t *phdr) +{ + return (struct sockaddr_un *) + ((PBYTE)(phdr) + AF_UNIX_PKT_OFFSETOF_NAME (phdr)); +} + +static inline struct cmsghdr * +AF_UNIX_PKT_CMSG (af_unix_pkt_hdr_t *phdr) +{ + return (struct cmsghdr *) + ((PBYTE)(phdr) + AF_UNIX_PKT_OFFSETOF_CMSG (phdr)); +} + +static inline void * +AF_UNIX_PKT_DATA (af_unix_pkt_hdr_t *phdr) +{ + return (void *) ((PBYTE)(phdr) + AF_UNIX_PKT_OFFSETOF_DATA (phdr)); +} + +static inline void * +AF_UNIX_PKT_DATA_END (af_unix_pkt_hdr_t *phdr) +{ + return (void *) ((PBYTE)(phdr) + AF_UNIX_PKT_OFFSETOF_DATA (phdr) + + (phdr)->data_len); +} + +inline bool +AF_UNIX_PKT_DATA_APPEND (af_unix_pkt_hdr_t *phdr, void *data, uint16_t dlen) +{ + if ((uint32_t) phdr->pckt_len + (uint32_t) dlen > MAX_AF_UN_PKT_LEN) + return false; + memcpy (AF_UNIX_PKT_DATA_END (phdr), data, dlen); + phdr->pckt_len += dlen; + phdr->data_len += dlen; + return true; +} /* Some error conditions on pipes have multiple status codes, unfortunately. */ #define STATUS_PIPE_NO_INSTANCE_AVAILABLE(status) \ @@ -139,9 +171,10 @@ class af_unix_pkt_hdr_t || _s == STATUS_PIPE_NOT_AVAILABLE \ || _s == STATUS_PIPE_BUSY; }) -#define STATUS_PIPE_IS_CLOSING(status) \ +#define STATUS_PIPE_IS_CLOSED(status) \ ({ NTSTATUS _s = (status); \ _s == STATUS_PIPE_CLOSING \ + || _s == STATUS_PIPE_BROKEN \ || _s == STATUS_PIPE_EMPTY; }) #define STATUS_PIPE_INVALID(status) \