SCTP : Add paramters validity check for ASCONF chunk
If ADDIP is enabled, when an ASCONF chunk is received with ASCONF paramter length set to zero, this will cause infinite loop. By the way, if an malformed ASCONF chunk is received, will cause processing to access memory without verifying. This is because of not check the validity of parameters in ASCONF chunk. This patch fixed this. Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com> Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
This commit is contained in:
committed by
David S. Miller
parent
3c77f961b5
commit
6f4c618ddb
@@ -2499,6 +2499,52 @@ static __be16 sctp_process_asconf_param(struct sctp_association *asoc,
|
||||
return SCTP_ERROR_NO_ERROR;
|
||||
}
|
||||
|
||||
/* Verify the ASCONF packet before we process it. */
|
||||
int sctp_verify_asconf(const struct sctp_association *asoc,
|
||||
struct sctp_paramhdr *param_hdr, void *chunk_end,
|
||||
struct sctp_paramhdr **errp) {
|
||||
sctp_addip_param_t *asconf_param;
|
||||
union sctp_params param;
|
||||
int length, plen;
|
||||
|
||||
param.v = (sctp_paramhdr_t *) param_hdr;
|
||||
while (param.v <= chunk_end - sizeof(sctp_paramhdr_t)) {
|
||||
length = ntohs(param.p->length);
|
||||
*errp = param.p;
|
||||
|
||||
if (param.v > chunk_end - length ||
|
||||
length < sizeof(sctp_paramhdr_t))
|
||||
return 0;
|
||||
|
||||
switch (param.p->type) {
|
||||
case SCTP_PARAM_ADD_IP:
|
||||
case SCTP_PARAM_DEL_IP:
|
||||
case SCTP_PARAM_SET_PRIMARY:
|
||||
asconf_param = (sctp_addip_param_t *)param.v;
|
||||
plen = ntohs(asconf_param->param_hdr.length);
|
||||
if (plen < sizeof(sctp_addip_param_t) +
|
||||
sizeof(sctp_paramhdr_t))
|
||||
return 0;
|
||||
break;
|
||||
case SCTP_PARAM_SUCCESS_REPORT:
|
||||
case SCTP_PARAM_ADAPTATION_LAYER_IND:
|
||||
if (length != sizeof(sctp_addip_param_t))
|
||||
return 0;
|
||||
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
param.v += WORD_ROUND(length);
|
||||
}
|
||||
|
||||
if (param.v != chunk_end)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Process an incoming ASCONF chunk with the next expected serial no. and
|
||||
* return an ASCONF_ACK chunk to be sent in response.
|
||||
*/
|
||||
|
Reference in New Issue
Block a user