Merge tag 'for-linus-4.6-rc0-tag' of git://git.kernel.org/pub/scm/linux/kernel/git...
[deliverable/linux.git] / net / rxrpc / af_rxrpc.c
index 5e810b83269f0b22090b6bfa9c0c33ea03ce68a6..9d935fa5a2a98884beca08329433cf66dbafebdc 100644 (file)
@@ -81,6 +81,8 @@ static int rxrpc_validate_address(struct rxrpc_sock *rx,
                                  struct sockaddr_rxrpc *srx,
                                  int len)
 {
+       unsigned int tail;
+
        if (len < sizeof(struct sockaddr_rxrpc))
                return -EINVAL;
 
@@ -103,9 +105,7 @@ static int rxrpc_validate_address(struct rxrpc_sock *rx,
                _debug("INET: %x @ %pI4",
                       ntohs(srx->transport.sin.sin_port),
                       &srx->transport.sin.sin_addr);
-               if (srx->transport_len > 8)
-                       memset((void *)&srx->transport + 8, 0,
-                              srx->transport_len - 8);
+               tail = offsetof(struct sockaddr_rxrpc, transport.sin.__pad);
                break;
 
        case AF_INET6:
@@ -113,6 +113,8 @@ static int rxrpc_validate_address(struct rxrpc_sock *rx,
                return -EAFNOSUPPORT;
        }
 
+       if (tail < len)
+               memset((void *)srx + tail, 0, len - tail);
        return 0;
 }
 
@@ -121,7 +123,7 @@ static int rxrpc_validate_address(struct rxrpc_sock *rx,
  */
 static int rxrpc_bind(struct socket *sock, struct sockaddr *saddr, int len)
 {
-       struct sockaddr_rxrpc *srx = (struct sockaddr_rxrpc *) saddr;
+       struct sockaddr_rxrpc *srx = (struct sockaddr_rxrpc *)saddr;
        struct sock *sk = sock->sk;
        struct rxrpc_local *local;
        struct rxrpc_sock *rx = rxrpc_sk(sk), *prx;
@@ -142,7 +144,7 @@ static int rxrpc_bind(struct socket *sock, struct sockaddr *saddr, int len)
 
        memcpy(&rx->srx, srx, sizeof(rx->srx));
 
-       /* find a local transport endpoint if we don't have one already */
+       /* Find or create a local transport endpoint to use */
        local = rxrpc_lookup_local(&rx->srx);
        if (IS_ERR(local)) {
                ret = PTR_ERR(local);
@@ -297,7 +299,6 @@ struct rxrpc_call *rxrpc_kernel_begin_call(struct socket *sock,
 
        if (!srx)
                srx = &rx->srx;
-
        if (!key)
                key = rx->key;
        if (key && !key->payload.data[0])
@@ -319,7 +320,6 @@ out_notrans:
        _leave(" = %p", call);
        return call;
 }
-
 EXPORT_SYMBOL(rxrpc_kernel_begin_call);
 
 /**
@@ -335,7 +335,6 @@ void rxrpc_kernel_end_call(struct rxrpc_call *call)
        rxrpc_remove_user_ID(call->socket, call);
        rxrpc_put_call(call);
 }
-
 EXPORT_SYMBOL(rxrpc_kernel_end_call);
 
 /**
@@ -616,7 +615,7 @@ static int rxrpc_create(struct net *net, struct socket *sock, int protocol,
        if (!net_eq(net, &init_net))
                return -EAFNOSUPPORT;
 
-       /* we support transport protocol UDP only */
+       /* we support transport protocol UDP/UDP6 only */
        if (protocol != PF_INET)
                return -EPROTONOSUPPORT;
 
This page took 0.039553 seconds and 5 git commands to generate.