diff options
author | delphij <delphij@FreeBSD.org> | 2010-02-09 22:30:51 +0000 |
---|---|---|
committer | delphij <delphij@FreeBSD.org> | 2010-02-09 22:30:51 +0000 |
commit | 54ac71ad0f6c9320cedd699c4dce60be1177e418 (patch) | |
tree | b0e7379f53d44bb1702fe8769f453e089f5fc10a /sys/compat/linux/linux_socket.c | |
parent | eb28e347bf550058149b7d43646514104407e262 (diff) | |
download | FreeBSD-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/linux/linux_socket.c')
-rw-r--r-- | sys/compat/linux/linux_socket.c | 9 |
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; |