diff options
author | dchagin <dchagin@FreeBSD.org> | 2016-06-05 07:43:20 +0000 |
---|---|---|
committer | dchagin <dchagin@FreeBSD.org> | 2016-06-05 07:43:20 +0000 |
commit | 32dd9edc0555ce09f7ac2a113175c6a42e44348a (patch) | |
tree | 099ce9de01f0dc174f123a48b1e5ddffe688dd74 | |
parent | f7acef050aa47d67fcdb27ca3ccea5cdbaae2e67 (diff) | |
download | FreeBSD-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.c | 16 |
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)); } |