This is the mail archive of the
cygwin-patches
mailing list for the Cygwin project.
[PATCH v2 2/5] Cygwin: AF_LOCAL: set appropriate errno on system calls
- From: Ken Brown <kbrown at cornell dot edu>
- To: "cygwin-patches at cygwin dot com" <cygwin-patches at cygwin dot com>
- Date: Wed, 29 Jan 2020 17:22:11 +0000
- Subject: [PATCH v2 2/5] Cygwin: AF_LOCAL: set appropriate errno on system calls
- Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=cornell.edu; dmarc=pass action=none header.from=cornell.edu; dkim=pass header.d=cornell.edu; arc=none
- Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=AmuTXdMU65u6Cw5dlqoyR1XN+nIQNtuse7/i2MiT5eo=; b=Ahc5vh8UQpJKYDg+xouSvoxf90ElGu35WlXfWEC1jyCbMFaBYhT7ZINGggdRSa/YCFoE2vjLwxXT9AMkXFXwNIx26H6KQ7xTOTP7uNBcwYESGEHlUQ/dKXqtlSyxQDK3+NmzrAlcjux244dHMh3x/8nahTA0fOS/mh5kcbjT9nIIbuxw2rvd29Sroi8Y4vPmERjNDSHGH3CaUzk66FxJfVtrkijQeqikfIvYY0xlq8ERlSmeJuTaZRvEOI0gDda5ahS5pYu/oe1+5CESsjEP7KWGR3qM1Dmsvwm0JSjb4lSjJgZpIbYzMuk/fT2WOBdjWvw3wPUnbXnfp2FuvQg0cg==
- Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=YAy1Jq8S2d0ivwwiKrD+xU3w1VXRgWuMKXFHDl7my6rZ+XpQJuJdGPSWIudd5S3xyTX0nss7/wIuwUZ6WjDvtIaebDlf5trK6Y/6tpejwduBtBG+Ec1jQijUOM1WCjcm3pviBgVH8kGvO0MUcsUUXeHZBBEgmGbKUhA4h4k3UQyq9SkKa6+1SnUT55LBL6nIyY8UXdR5sXIR8StmDoV1Kgg8kz1H5KSog3oTNHS02xAwZrXJ792xqI98U65FbkCLl64PWBTH97U4vrRPzk20iKHmfYWwqA/jRrssEH8KMfMYV08vIZf3glAzJLfTzwDi3a9Y15Fh5sYxNpbbVMA5aQ==
- References: <20200129172147.1566-1-kbrown@cornell.edu>
If an AF_LOCAL socket is opened with O_PATH, all socket system calls
that take a file descriptor argument fail on the resulting descriptor.
Make sure that errno is set as on Linux for those calls that are
implemented on Linux. In almost all cases it is ENOTSOCK. There are
two exceptions:
- sockatatmark(3); errno is EBADF.
- bindresvport(3); errno is EAFNOSUPPORT if the second argument sin
(of type struct sockaddr_in *) is non-NULL and satisfies
sin->sin_family == AF_INET.
Finally, there are two BSD socket system calls implemented on Cygwin
but not Linux: getpeereid(3) and bindresvport_sa(3). Set errno to
ENOTSOCK for these for consistency with the majority of the other
calls.
---
winsup/cygwin/net.cc | 19 +++++++++++++++----
1 file changed, 15 insertions(+), 4 deletions(-)
diff --git a/winsup/cygwin/net.cc b/winsup/cygwin/net.cc
index 437712c63..d9f51bf68 100644
--- a/winsup/cygwin/net.cc
+++ b/winsup/cygwin/net.cc
@@ -65,8 +65,11 @@ get (const int fd)
fhandler_socket *const fh = cfd->is_socket ();
- if (!fh)
- set_errno (ENOTSOCK);
+ if (!fh || (fh->get_flags () & O_PATH))
+ {
+ set_errno (ENOTSOCK);
+ return NULL;
+ }
return fh;
}
@@ -641,9 +644,17 @@ extern "C" int
sockatmark (int fd)
{
int ret;
+ cygheap_fdget cfd (fd);
- fhandler_socket *fh = get (fd);
- if (fh && fh->ioctl (SIOCATMARK, &ret) != -1)
+ if (cfd < 0)
+ return -1;
+
+ fhandler_socket *const fh = cfd->is_socket ();
+ if (!fh)
+ set_errno (ENOTSOCK);
+ else if (fh->get_flags () & O_PATH)
+ set_errno (EBADF);
+ else if (fh->ioctl (SIOCATMARK, &ret) != -1)
return ret;
return -1;
}
--
2.21.0