summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordchagin <dchagin@FreeBSD.org>2016-06-05 07:43:20 +0000
committerdchagin <dchagin@FreeBSD.org>2016-06-05 07:43:20 +0000
commit32dd9edc0555ce09f7ac2a113175c6a42e44348a (patch)
tree099ce9de01f0dc174f123a48b1e5ddffe688dd74
parentf7acef050aa47d67fcdb27ca3ccea5cdbaae2e67 (diff)
downloadFreeBSD-src-32dd9edc0555ce09f7ac2a113175c6a42e44348a.zip
FreeBSD-src-32dd9edc0555ce09f7ac2a113175c6a42e44348a.tar.gz
MFC r300431:
Convert proto family in both directions. The linux and native values for local and inet are identical, but for inet6 values differ. PR: 155040 Reported by: Simon Walton
-rw-r--r--sys/compat/linux/linux_socket.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/sys/compat/linux/linux_socket.c b/sys/compat/linux/linux_socket.c
index 4bc4798..bc543c7 100644
--- a/sys/compat/linux/linux_socket.c
+++ b/sys/compat/linux/linux_socket.c
@@ -462,12 +462,16 @@ bsd_to_linux_sockaddr(struct sockaddr *arg)
{
struct sockaddr sa;
size_t sa_len = sizeof(struct sockaddr);
- int error;
+ int error, bdom;
if ((error = copyin(arg, &sa, sa_len)))
return (error);
- *(u_short *)&sa = sa.sa_family;
+ bdom = bsd_to_linux_domain(sa.sa_family);
+ if (bdom == -1)
+ return (EAFNOSUPPORT);
+
+ *(u_short *)&sa = bdom;
return (copyout(&sa, arg, sa_len));
}
@@ -476,12 +480,16 @@ linux_to_bsd_sockaddr(struct sockaddr *arg, int len)
{
struct sockaddr sa;
size_t sa_len = sizeof(struct sockaddr);
- int error;
+ int error, bdom;
if ((error = copyin(arg, &sa, sa_len)))
return (error);
- sa.sa_family = *(sa_family_t *)&sa;
+ bdom = linux_to_bsd_domain(*(sa_family_t *)&sa);
+ if (bdom == -1)
+ return (EAFNOSUPPORT);
+
+ sa.sa_family = bdom;
sa.sa_len = len;
return (copyout(&sa, arg, sa_len));
}
OpenPOWER on IntegriCloud