diff options
Diffstat (limited to 'security/selinux/hooks.c')
-rw-r--r-- | security/selinux/hooks.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index d37a72316e9d..e67a526d1f30 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
@@ -4367,10 +4367,18 @@ static int selinux_socket_bind(struct socket *sock, struct sockaddr *address, in | |||
4367 | u32 sid, node_perm; | 4367 | u32 sid, node_perm; |
4368 | 4368 | ||
4369 | if (family == PF_INET) { | 4369 | if (family == PF_INET) { |
4370 | if (addrlen < sizeof(struct sockaddr_in)) { | ||
4371 | err = -EINVAL; | ||
4372 | goto out; | ||
4373 | } | ||
4370 | addr4 = (struct sockaddr_in *)address; | 4374 | addr4 = (struct sockaddr_in *)address; |
4371 | snum = ntohs(addr4->sin_port); | 4375 | snum = ntohs(addr4->sin_port); |
4372 | addrp = (char *)&addr4->sin_addr.s_addr; | 4376 | addrp = (char *)&addr4->sin_addr.s_addr; |
4373 | } else { | 4377 | } else { |
4378 | if (addrlen < SIN6_LEN_RFC2133) { | ||
4379 | err = -EINVAL; | ||
4380 | goto out; | ||
4381 | } | ||
4374 | addr6 = (struct sockaddr_in6 *)address; | 4382 | addr6 = (struct sockaddr_in6 *)address; |
4375 | snum = ntohs(addr6->sin6_port); | 4383 | snum = ntohs(addr6->sin6_port); |
4376 | addrp = (char *)&addr6->sin6_addr.s6_addr; | 4384 | addrp = (char *)&addr6->sin6_addr.s6_addr; |