summaryrefslogtreecommitdiffstats
path: root/sys/compat
diff options
context:
space:
mode:
authordelphij <delphij@FreeBSD.org>2010-02-09 22:30:51 +0000
committerdelphij <delphij@FreeBSD.org>2010-02-09 22:30:51 +0000
commit54ac71ad0f6c9320cedd699c4dce60be1177e418 (patch)
treeb0e7379f53d44bb1702fe8769f453e089f5fc10a /sys/compat
parenteb28e347bf550058149b7d43646514104407e262 (diff)
downloadFreeBSD-src-54ac71ad0f6c9320cedd699c4dce60be1177e418.zip
FreeBSD-src-54ac71ad0f6c9320cedd699c4dce60be1177e418.tar.gz
- Return EAFNOSUPPORT instead of EINVAL for unsupported address family,
this matches the Linux behavior. - Check if we have sufficient space allocated for socket structure, which fixes a buffer overflow when wrong length is being passed into the emulation layer. [1] PR: kern/138860 Submitted by: Mateusz Guzik <mjguzik gmail com> Reported by: Alexander Best [1] MFC after: 2 weeks
Diffstat (limited to 'sys/compat')
-rw-r--r--sys/compat/linux/linux_socket.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/sys/compat/linux/linux_socket.c b/sys/compat/linux/linux_socket.c
index 396a71e..d94d926 100644
--- a/sys/compat/linux/linux_socket.c
+++ b/sys/compat/linux/linux_socket.c
@@ -128,7 +128,7 @@ do_sa_get(struct sockaddr **sap, const struct osockaddr *osa, int *osalen,
bdom = linux_to_bsd_domain(kosa->sa_family);
if (bdom == -1) {
- error = EINVAL;
+ error = EAFNOSUPPORT;
goto out;
}
@@ -157,8 +157,13 @@ do_sa_get(struct sockaddr **sap, const struct osockaddr *osa, int *osalen,
}
} else
#endif
- if (bdom == AF_INET)
+ if (bdom == AF_INET) {
alloclen = sizeof(struct sockaddr_in);
+ if (*osalen < alloclen) {
+ error = EINVAL;
+ goto out;
+ }
+ }
sa = (struct sockaddr *) kosa;
sa->sa_family = bdom;
OpenPOWER on IntegriCloud