diff options
author | dchagin <dchagin@FreeBSD.org> | 2009-05-07 03:23:22 +0000 |
---|---|---|
committer | dchagin <dchagin@FreeBSD.org> | 2009-05-07 03:23:22 +0000 |
commit | 9f1df514229a703d7db011676bd5a157cb106ddc (patch) | |
tree | 785a91aae2ba245bb87905df48ddf5d4fe932f96 /sys/compat | |
parent | 0d6358f7957671afd7e5aa8708481d1246ad8f81 (diff) | |
download | FreeBSD-src-9f1df514229a703d7db011676bd5a157cb106ddc.zip FreeBSD-src-9f1df514229a703d7db011676bd5a157cb106ddc.tar.gz |
Rework r191742.
Use the protocol family constants for the domain argument validation.
Return EAFNOSUPPORT in case when the incorrect domain argument
is specified.
Return EPROTONOSUPPORT instead of passing values that are not 0
to the BSD layer.
Suggested by: rwatson
Approved by: kib (mentor)
MFC after: 1 month
Diffstat (limited to 'sys/compat')
-rw-r--r-- | sys/compat/linux/linux_socket.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/sys/compat/linux/linux_socket.c b/sys/compat/linux/linux_socket.c index c92fd12..91a1a46 100644 --- a/sys/compat/linux/linux_socket.c +++ b/sys/compat/linux/linux_socket.c @@ -855,14 +855,21 @@ linux_socketpair(struct thread *td, struct linux_socketpair_args *args) } */ bsd_args; bsd_args.domain = linux_to_bsd_domain(args->domain); - if (bsd_args.domain == -1) - return (EINVAL); + if (bsd_args.domain != PF_LOCAL) + return (EAFNOSUPPORT); bsd_args.type = args->type; - if (bsd_args.domain == AF_LOCAL && args->protocol == PF_UNIX) - bsd_args.protocol = 0; + if (args->protocol != 0 && args->protocol != PF_UNIX) + + /* + * Use of PF_UNIX as protocol argument is not right, + * but Linux does it. + * Do not map PF_UNIX as its Linux value is identical + * to FreeBSD one. + */ + return (EPROTONOSUPPORT); else - bsd_args.protocol = args->protocol; + bsd_args.protocol = 0; bsd_args.rsv = (int *)PTRIN(args->rsv); return (socketpair(td, &bsd_args)); } |