sctp: fix check the chunk length of received HEARTBEAT-ACK chunk
authorWei Yongjun <yjwei@cn.fujitsu.com>
Sat, 22 Aug 2009 03:27:37 +0000 (11:27 +0800)
committerVlad Yasevich <vladislav.yasevich@hp.com>
Fri, 4 Sep 2009 22:20:58 +0000 (18:20 -0400)
The receiver of the HEARTBEAT should respond with a HEARTBEAT ACK
that contains the Heartbeat Information field copied from the
received HEARTBEAT chunk. So the received HEARTBEAT-ACK chunk
must have a length of:
  sizeof(sctp_chunkhdr_t) + sizeof(sctp_sender_hb_info_t)

A badly formatted HB-ACK chunk, it is possible that we may access
invalid memory.  We should really make sure that the chunk format
is what we expect, before attempting to touch the data.

Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
net/sctp/sm_statefuns.c

index 73bdeb2b6c62302f0fe8ef0621b5ac2b6383723f..7fb08a694917bbb01c2957e0c6de4e81c4ec5d4c 100644 (file)
@@ -1115,7 +1115,8 @@ sctp_disposition_t sctp_sf_backbeat_8_3(const struct sctp_endpoint *ep,
                return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
 
        /* Make sure that the HEARTBEAT-ACK chunk has a valid length.  */
-       if (!sctp_chunk_length_valid(chunk, sizeof(sctp_heartbeat_chunk_t)))
+       if (!sctp_chunk_length_valid(chunk, sizeof(sctp_chunkhdr_t) +
+                                           sizeof(sctp_sender_hb_info_t)))
                return sctp_sf_violation_chunklen(ep, asoc, type, arg,
                                                  commands);