summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordchagin <dchagin@FreeBSD.org>2016-03-27 06:43:05 +0000
committerdchagin <dchagin@FreeBSD.org>2016-03-27 06:43:05 +0000
commitef3387785250f1e6d21eeb0bd4cdfd134077e40b (patch)
tree4698467b77a4a092f3a44bbb0962f08e180f9a2f
parentc1237fc26ea15df3a3b3c65770fabc5a7080edf0 (diff)
downloadFreeBSD-src-ef3387785250f1e6d21eeb0bd4cdfd134077e40b.zip
FreeBSD-src-ef3387785250f1e6d21eeb0bd4cdfd134077e40b.tar.gz
MFC r296503, r296504:
Linux accept() system call return EOPNOTSUPP errno instead of EINVAL for UDP sockets.
-rw-r--r--sys/compat/linux/linux_socket.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/sys/compat/linux/linux_socket.c b/sys/compat/linux/linux_socket.c
index c19167a..6df0ce7 100644
--- a/sys/compat/linux/linux_socket.c
+++ b/sys/compat/linux/linux_socket.c
@@ -838,7 +838,10 @@ linux_accept_common(struct thread *td, int s, l_uintptr_t addr,
socklen_t * __restrict anamelen;
int flags;
} */ bsd_args;
- int error;
+ cap_rights_t rights;
+ struct socket *so;
+ struct file *fp;
+ int error, error1;
bsd_args.s = s;
/* XXX: */
@@ -853,6 +856,17 @@ linux_accept_common(struct thread *td, int s, l_uintptr_t addr,
if (error) {
if (error == EFAULT && namelen != sizeof(struct sockaddr_in))
return (EINVAL);
+ if (error == EINVAL) {
+ error1 = getsock_cap(td, s, &rights, &fp, NULL);
+ if (error1 != 0)
+ return (error1);
+ so = fp->f_data;
+ if (so->so_type == SOCK_DGRAM) {
+ fdrop(fp, td);
+ return (EOPNOTSUPP);
+ }
+ fdrop(fp, td);
+ }
return (error);
}
if (addr)
OpenPOWER on IntegriCloud