Denis Kirjanov 917a7d
From b1eef66295a6c4f4f42b235592b339a8fa0d067c Mon Sep 17 00:00:00 2001
Denis Kirjanov 917a7d
From: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Denis Kirjanov 917a7d
Date: Mon, 8 Jan 2018 19:02:29 -0200
Denis Kirjanov 917a7d
Subject: [PATCH 5/7] sctp: make use of pre-calculated len
Denis Kirjanov 917a7d
Git-commit: c76f97c99ae6d26d14c7f0e50e074382bfbc9f98
Denis Kirjanov 917a7d
Patch-mainline: 4.15-rc8
Denis Kirjanov 917a7d
References: git-fixes
Denis Kirjanov 917a7d
Denis Kirjanov 917a7d
Some sockopt handling functions were calculating the length of the
Denis Kirjanov 917a7d
buffer to be written to userspace and then calculating it again when
Denis Kirjanov 917a7d
actually writing the buffer, which could lead to some write not using
Denis Kirjanov 917a7d
an up-to-date length.
Denis Kirjanov 917a7d
Denis Kirjanov 917a7d
This patch updates such places to just make use of the len variable.
Denis Kirjanov 917a7d
Denis Kirjanov 917a7d
Also, replace some sizeof(type) to sizeof(var).
Denis Kirjanov 917a7d
Denis Kirjanov 917a7d
Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Denis Kirjanov 917a7d
Signed-off-by: David S. Miller <davem@davemloft.net>
Denis Kirjanov 917a7d
Signed-off-by: Denis Kirjanov <denis.kirjanov@suse.com>
Denis Kirjanov 917a7d
---
Denis Kirjanov 917a7d
 net/sctp/socket.c | 16 ++++++++++------
Denis Kirjanov 917a7d
 1 file changed, 10 insertions(+), 6 deletions(-)
Denis Kirjanov 917a7d
Denis Kirjanov 917a7d
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
Denis Kirjanov 917a7d
index 4713dd8f5ecf..7e2914216f0f 100644
Denis Kirjanov 917a7d
--- a/net/sctp/socket.c
Denis Kirjanov 917a7d
+++ b/net/sctp/socket.c
Denis Kirjanov 917a7d
@@ -4983,7 +4983,7 @@ static int sctp_getsockopt_autoclose(struct sock *sk, int len, char __user *optv
Denis Kirjanov 917a7d
 	len = sizeof(int);
Denis Kirjanov 917a7d
 	if (put_user(len, optlen))
Denis Kirjanov 917a7d
 		return -EFAULT;
Denis Kirjanov 917a7d
-	if (copy_to_user(optval, &sctp_sk(sk)->autoclose, sizeof(int)))
Denis Kirjanov 917a7d
+	if (copy_to_user(optval, &sctp_sk(sk)->autoclose, len))
Denis Kirjanov 917a7d
 		return -EFAULT;
Denis Kirjanov 917a7d
 	return 0;
Denis Kirjanov 917a7d
 }
Denis Kirjanov 917a7d
@@ -5560,6 +5560,9 @@ static int sctp_getsockopt_local_addrs(struct sock *sk, int len,
Denis Kirjanov 917a7d
 		err = -EFAULT;
Denis Kirjanov 917a7d
 		goto out;
Denis Kirjanov 917a7d
 	}
Denis Kirjanov 917a7d
+	/* XXX: We should have accounted for sizeof(struct sctp_getaddrs) too,
Denis Kirjanov 917a7d
+	 * but we can't change it anymore.
Denis Kirjanov 917a7d
+	 */
Denis Kirjanov 917a7d
 	if (put_user(bytes_copied, optlen))
Denis Kirjanov 917a7d
 		err = -EFAULT;
Denis Kirjanov 917a7d
 out:
Denis Kirjanov 917a7d
@@ -5996,7 +5999,7 @@ static int sctp_getsockopt_maxseg(struct sock *sk, int len,
Denis Kirjanov 917a7d
 		params.assoc_id = 0;
Denis Kirjanov 917a7d
 	} else if (len >= sizeof(struct sctp_assoc_value)) {
Denis Kirjanov 917a7d
 		len = sizeof(struct sctp_assoc_value);
Denis Kirjanov 917a7d
-		if (copy_from_user(&params, optval, sizeof(params)))
Denis Kirjanov 917a7d
+		if (copy_from_user(&params, optval, len))
Denis Kirjanov 917a7d
 			return -EFAULT;
Denis Kirjanov 917a7d
 	} else
Denis Kirjanov 917a7d
 		return -EINVAL;
Denis Kirjanov 917a7d
@@ -6165,7 +6168,9 @@ static int sctp_getsockopt_active_key(struct sock *sk, int len,
Denis Kirjanov 917a7d
 
Denis Kirjanov 917a7d
 	if (len < sizeof(struct sctp_authkeyid))
Denis Kirjanov 917a7d
 		return -EINVAL;
Denis Kirjanov 917a7d
-	if (copy_from_user(&val, optval, sizeof(struct sctp_authkeyid)))
Denis Kirjanov 917a7d
+
Denis Kirjanov 917a7d
+	len = sizeof(struct sctp_authkeyid);
Denis Kirjanov 917a7d
+	if (copy_from_user(&val, optval, len))
Denis Kirjanov 917a7d
 		return -EFAULT;
Denis Kirjanov 917a7d
 
Denis Kirjanov 917a7d
 	asoc = sctp_id2assoc(sk, val.scact_assoc_id);
Denis Kirjanov 917a7d
@@ -6177,7 +6182,6 @@ static int sctp_getsockopt_active_key(struct sock *sk, int len,
Denis Kirjanov 917a7d
 	else
Denis Kirjanov 917a7d
 		val.scact_keynumber = ep->active_key_id;
Denis Kirjanov 917a7d
 
Denis Kirjanov 917a7d
-	len = sizeof(struct sctp_authkeyid);
Denis Kirjanov 917a7d
 	if (put_user(len, optlen))
Denis Kirjanov 917a7d
 		return -EFAULT;
Denis Kirjanov 917a7d
 	if (copy_to_user(optval, &val, len))
Denis Kirjanov 917a7d
@@ -6203,7 +6207,7 @@ static int sctp_getsockopt_peer_auth_chunks(struct sock *sk, int len,
Denis Kirjanov 917a7d
 	if (len < sizeof(struct sctp_authchunks))
Denis Kirjanov 917a7d
 		return -EINVAL;
Denis Kirjanov 917a7d
 
Denis Kirjanov 917a7d
-	if (copy_from_user(&val, optval, sizeof(struct sctp_authchunks)))
Denis Kirjanov 917a7d
+	if (copy_from_user(&val, optval, sizeof(val)))
Denis Kirjanov 917a7d
 		return -EFAULT;
Denis Kirjanov 917a7d
 
Denis Kirjanov 917a7d
 	to = p->gauth_chunks;
Denis Kirjanov 917a7d
@@ -6248,7 +6252,7 @@ static int sctp_getsockopt_local_auth_chunks(struct sock *sk, int len,
Denis Kirjanov 917a7d
 	if (len < sizeof(struct sctp_authchunks))
Denis Kirjanov 917a7d
 		return -EINVAL;
Denis Kirjanov 917a7d
 
Denis Kirjanov 917a7d
-	if (copy_from_user(&val, optval, sizeof(struct sctp_authchunks)))
Denis Kirjanov 917a7d
+	if (copy_from_user(&val, optval, sizeof(val)))
Denis Kirjanov 917a7d
 		return -EFAULT;
Denis Kirjanov 917a7d
 
Denis Kirjanov 917a7d
 	to = p->gauth_chunks;
Denis Kirjanov 917a7d
-- 
Denis Kirjanov 917a7d
2.16.4
Denis Kirjanov 917a7d