diff options
Diffstat (limited to 'net/tipc')
| -rw-r--r-- | net/tipc/bearer.c | 4 | ||||
| -rw-r--r-- | net/tipc/bearer.h | 2 | ||||
| -rw-r--r-- | net/tipc/crypto.c | 32 | ||||
| -rw-r--r-- | net/tipc/eth_media.c | 2 | ||||
| -rw-r--r-- | net/tipc/ib_media.c | 2 | 
5 files changed, 26 insertions, 16 deletions
| diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c index 443f8e5b9477..60bc74b76adc 100644 --- a/net/tipc/bearer.c +++ b/net/tipc/bearer.c @@ -462,7 +462,7 @@ int tipc_enable_l2_media(struct net *net, struct tipc_bearer *b,  	b->bcast_addr.media_id = b->media->type_id;  	b->bcast_addr.broadcast = TIPC_BROADCAST_SUPPORT;  	b->mtu = dev->mtu; -	b->media->raw2addr(b, &b->addr, (char *)dev->dev_addr); +	b->media->raw2addr(b, &b->addr, (const char *)dev->dev_addr);  	rcu_assign_pointer(dev->tipc_ptr, b);  	return 0;  } @@ -703,7 +703,7 @@ static int tipc_l2_device_event(struct notifier_block *nb, unsigned long evt,  		break;  	case NETDEV_CHANGEADDR:  		b->media->raw2addr(b, &b->addr, -				   (char *)dev->dev_addr); +				   (const char *)dev->dev_addr);  		tipc_reset_bearer(net, b);  		break;  	case NETDEV_UNREGISTER: diff --git a/net/tipc/bearer.h b/net/tipc/bearer.h index 57c6a1a719e2..490ad6e5f7a3 100644 --- a/net/tipc/bearer.h +++ b/net/tipc/bearer.h @@ -117,7 +117,7 @@ struct tipc_media {  			char *msg);  	int (*raw2addr)(struct tipc_bearer *b,  			struct tipc_media_addr *addr, -			char *raw); +			const char *raw);  	u32 priority;  	u32 tolerance;  	u32 min_win; diff --git a/net/tipc/crypto.c b/net/tipc/crypto.c index c9391d38de85..dc60c32bb70d 100644 --- a/net/tipc/crypto.c +++ b/net/tipc/crypto.c @@ -2285,43 +2285,53 @@ static bool tipc_crypto_key_rcv(struct tipc_crypto *rx, struct tipc_msg *hdr)  	u16 key_gen = msg_key_gen(hdr);  	u16 size = msg_data_sz(hdr);  	u8 *data = msg_data(hdr); +	unsigned int keylen; + +	/* Verify whether the size can exist in the packet */ +	if (unlikely(size < sizeof(struct tipc_aead_key) + TIPC_AEAD_KEYLEN_MIN)) { +		pr_debug("%s: message data size is too small\n", rx->name); +		goto exit; +	} + +	keylen = ntohl(*((__be32 *)(data + TIPC_AEAD_ALG_NAME))); + +	/* Verify the supplied size values */ +	if (unlikely(size != keylen + sizeof(struct tipc_aead_key) || +		     keylen > TIPC_AEAD_KEY_SIZE_MAX)) { +		pr_debug("%s: invalid MSG_CRYPTO key size\n", rx->name); +		goto exit; +	}  	spin_lock(&rx->lock);  	if (unlikely(rx->skey || (key_gen == rx->key_gen && rx->key.keys))) {  		pr_err("%s: key existed <%p>, gen %d vs %d\n", rx->name,  		       rx->skey, key_gen, rx->key_gen); -		goto exit; +		goto exit_unlock;  	}  	/* Allocate memory for the key */  	skey = kmalloc(size, GFP_ATOMIC);  	if (unlikely(!skey)) {  		pr_err("%s: unable to allocate memory for skey\n", rx->name); -		goto exit; +		goto exit_unlock;  	}  	/* Copy key from msg data */ -	skey->keylen = ntohl(*((__be32 *)(data + TIPC_AEAD_ALG_NAME))); +	skey->keylen = keylen;  	memcpy(skey->alg_name, data, TIPC_AEAD_ALG_NAME);  	memcpy(skey->key, data + TIPC_AEAD_ALG_NAME + sizeof(__be32),  	       skey->keylen); -	/* Sanity check */ -	if (unlikely(size != tipc_aead_key_size(skey))) { -		kfree(skey); -		skey = NULL; -		goto exit; -	} -  	rx->key_gen = key_gen;  	rx->skey_mode = msg_key_mode(hdr);  	rx->skey = skey;  	rx->nokey = 0;  	mb(); /* for nokey flag */ -exit: +exit_unlock:  	spin_unlock(&rx->lock); +exit:  	/* Schedule the key attaching on this crypto */  	if (likely(skey && queue_delayed_work(tx->wq, &rx->work, 0)))  		return true; diff --git a/net/tipc/eth_media.c b/net/tipc/eth_media.c index c68019697cfe..cb0d185e06af 100644 --- a/net/tipc/eth_media.c +++ b/net/tipc/eth_media.c @@ -60,7 +60,7 @@ static int tipc_eth_addr2msg(char *msg, struct tipc_media_addr *addr)  /* Convert raw mac address format to media addr format */  static int tipc_eth_raw2addr(struct tipc_bearer *b,  			     struct tipc_media_addr *addr, -			     char *msg) +			     const char *msg)  {  	memset(addr, 0, sizeof(*addr));  	ether_addr_copy(addr->value, msg); diff --git a/net/tipc/ib_media.c b/net/tipc/ib_media.c index 7aa9ff88458d..b9ad0434c3cd 100644 --- a/net/tipc/ib_media.c +++ b/net/tipc/ib_media.c @@ -67,7 +67,7 @@ static int tipc_ib_addr2msg(char *msg, struct tipc_media_addr *addr)  /* Convert raw InfiniBand address format to media addr format */  static int tipc_ib_raw2addr(struct tipc_bearer *b,  			    struct tipc_media_addr *addr, -			    char *msg) +			    const char *msg)  {  	memset(addr, 0, sizeof(*addr));  	memcpy(addr->value, msg, INFINIBAND_ALEN); |