@@ -4517,22 +4517,29 @@ static int selinux_socket_bind(struct socket *sock, struct sockaddr *address, in
45174517 * need to check address->sa_family as it is possible to have
45184518 * sk->sk_family = PF_INET6 with addr->sa_family = AF_INET.
45194519 */
4520- if (address -> sa_family == AF_INET ) {
4521- if (addrlen < sizeof (struct sockaddr_in )) {
4522- err = - EINVAL ;
4523- goto out ;
4524- }
4520+ switch (address -> sa_family ) {
4521+ case AF_INET :
4522+ if (addrlen < sizeof (struct sockaddr_in ))
4523+ return - EINVAL ;
45254524 addr4 = (struct sockaddr_in * )address ;
45264525 snum = ntohs (addr4 -> sin_port );
45274526 addrp = (char * )& addr4 -> sin_addr .s_addr ;
4528- } else {
4529- if (addrlen < SIN6_LEN_RFC2133 ) {
4530- err = - EINVAL ;
4531- goto out ;
4532- }
4527+ break ;
4528+ case AF_INET6 :
4529+ if (addrlen < SIN6_LEN_RFC2133 )
4530+ return - EINVAL ;
45334531 addr6 = (struct sockaddr_in6 * )address ;
45344532 snum = ntohs (addr6 -> sin6_port );
45354533 addrp = (char * )& addr6 -> sin6_addr .s6_addr ;
4534+ break ;
4535+ default :
4536+ /* Note that SCTP services expect -EINVAL, whereas
4537+ * others expect -EAFNOSUPPORT.
4538+ */
4539+ if (sksec -> sclass == SECCLASS_SCTP_SOCKET )
4540+ return - EINVAL ;
4541+ else
4542+ return - EAFNOSUPPORT ;
45364543 }
45374544
45384545 if (snum ) {
@@ -4636,16 +4643,27 @@ static int selinux_socket_connect_helper(struct socket *sock,
46364643 * need to check address->sa_family as it is possible to have
46374644 * sk->sk_family = PF_INET6 with addr->sa_family = AF_INET.
46384645 */
4639- if (address -> sa_family == AF_INET ) {
4646+ switch (address -> sa_family ) {
4647+ case AF_INET :
46404648 addr4 = (struct sockaddr_in * )address ;
46414649 if (addrlen < sizeof (struct sockaddr_in ))
46424650 return - EINVAL ;
46434651 snum = ntohs (addr4 -> sin_port );
4644- } else {
4652+ break ;
4653+ case AF_INET6 :
46454654 addr6 = (struct sockaddr_in6 * )address ;
46464655 if (addrlen < SIN6_LEN_RFC2133 )
46474656 return - EINVAL ;
46484657 snum = ntohs (addr6 -> sin6_port );
4658+ break ;
4659+ default :
4660+ /* Note that SCTP services expect -EINVAL, whereas
4661+ * others expect -EAFNOSUPPORT.
4662+ */
4663+ if (sksec -> sclass == SECCLASS_SCTP_SOCKET )
4664+ return - EINVAL ;
4665+ else
4666+ return - EAFNOSUPPORT ;
46494667 }
46504668
46514669 err = sel_netport_sid (sk -> sk_protocol , snum , & sid );
0 commit comments