| From c7064b2bd573a5bd2364e076878c753c5da50ee5 Mon Sep 17 00:00:00 2001 |
| From: Vlad Yasevich <vladislav.yasevich@hp.com> |
| Date: Wed, 27 Aug 2008 22:41:52 -0700 |
| Subject: sctp: add verification checks to SCTP_AUTH_KEY option |
| |
| From: Vlad Yasevich <vladislav.yasevich@hp.com> |
| |
| [ Upstream commit 30c2235cbc477d4629983d440cdc4f496fec9246 ] |
| |
| The structure used for SCTP_AUTH_KEY option contains a |
| length that needs to be verfied to prevent buffer overflow |
| conditions. Spoted by Eugene Teo <eteo@redhat.com>. |
| |
| Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| net/sctp/auth.c | 4 ++++ |
| net/sctp/socket.c | 5 +++++ |
| 2 files changed, 9 insertions(+) |
| |
| --- a/net/sctp/auth.c |
| +++ b/net/sctp/auth.c |
| @@ -80,6 +80,10 @@ static struct sctp_auth_bytes *sctp_auth |
| { |
| struct sctp_auth_bytes *key; |
| |
| + /* Verify that we are not going to overflow INT_MAX */ |
| + if ((INT_MAX - key_len) < sizeof(struct sctp_auth_bytes)) |
| + return NULL; |
| + |
| /* Allocate the shared key */ |
| key = kmalloc(sizeof(struct sctp_auth_bytes) + key_len, gfp); |
| if (!key) |
| --- a/net/sctp/socket.c |
| +++ b/net/sctp/socket.c |
| @@ -3072,6 +3072,11 @@ static int sctp_setsockopt_auth_key(stru |
| goto out; |
| } |
| |
| + if (authkey->sca_keylength > optlen) { |
| + ret = -EINVAL; |
| + goto out; |
| + } |
| + |
| asoc = sctp_id2assoc(sk, authkey->sca_assoc_id); |
| if (!asoc && authkey->sca_assoc_id && sctp_style(sk, UDP)) { |
| ret = -EINVAL; |