diff options
Diffstat (limited to 'net/sctp/sm_make_chunk.c')
| -rw-r--r-- | net/sctp/sm_make_chunk.c | 22 | 
1 files changed, 20 insertions, 2 deletions
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c index 06320c8c1c86..7954c52e1794 100644 --- a/net/sctp/sm_make_chunk.c +++ b/net/sctp/sm_make_chunk.c @@ -3090,8 +3090,19 @@ static __be16 sctp_process_asconf_param(struct sctp_association *asoc,  			sctp_assoc_set_primary(asoc, asconf->transport);  			sctp_assoc_del_nonprimary_peers(asoc,  							asconf->transport); -		} else -			sctp_assoc_del_peer(asoc, &addr); +			return SCTP_ERROR_NO_ERROR; +		} + +		/* If the address is not part of the association, the +		 * ASCONF-ACK with Error Cause Indication Parameter +		 * which including cause of Unresolvable Address should +		 * be sent. +		 */ +		peer = sctp_assoc_lookup_paddr(asoc, &addr); +		if (!peer) +			return SCTP_ERROR_DNS_FAILED; + +		sctp_assoc_rm_peer(asoc, peer);  		break;  	case SCTP_PARAM_SET_PRIMARY:  		/* ADDIP Section 4.2.4 @@ -3132,11 +3143,18 @@ bool sctp_verify_asconf(const struct sctp_association *asoc,  		case SCTP_PARAM_IPV4_ADDRESS:  			if (length != sizeof(sctp_ipv4addr_param_t))  				return false; +			/* ensure there is only one addr param and it's in the +			 * beginning of addip_hdr params, or we reject it. +			 */ +			if (param.v != addip->addip_hdr.params) +				return false;  			addr_param_seen = true;  			break;  		case SCTP_PARAM_IPV6_ADDRESS:  			if (length != sizeof(sctp_ipv6addr_param_t))  				return false; +			if (param.v != addip->addip_hdr.params) +				return false;  			addr_param_seen = true;  			break;  		case SCTP_PARAM_ADD_IP:  |