|
@@ -5025,7 +5025,7 @@ static int sctp_getsockopt_autoclose(struct sock *sk, int len, char __user *optv
|
|
|
len = sizeof(int);
|
|
|
if (put_user(len, optlen))
|
|
|
return -EFAULT;
|
|
|
- if (copy_to_user(optval, &sctp_sk(sk)->autoclose, sizeof(int)))
|
|
|
+ if (copy_to_user(optval, &sctp_sk(sk)->autoclose, len))
|
|
|
return -EFAULT;
|
|
|
return 0;
|
|
|
}
|
|
@@ -5655,6 +5655,9 @@ copy_getaddrs:
|
|
|
err = -EFAULT;
|
|
|
goto out;
|
|
|
}
|
|
|
+ /* XXX: We should have accounted for sizeof(struct sctp_getaddrs) too,
|
|
|
+ * but we can't change it anymore.
|
|
|
+ */
|
|
|
if (put_user(bytes_copied, optlen))
|
|
|
err = -EFAULT;
|
|
|
out:
|
|
@@ -6091,7 +6094,7 @@ static int sctp_getsockopt_maxseg(struct sock *sk, int len,
|
|
|
params.assoc_id = 0;
|
|
|
} else if (len >= sizeof(struct sctp_assoc_value)) {
|
|
|
len = sizeof(struct sctp_assoc_value);
|
|
|
- if (copy_from_user(¶ms, optval, sizeof(params)))
|
|
|
+ if (copy_from_user(¶ms, optval, len))
|
|
|
return -EFAULT;
|
|
|
} else
|
|
|
return -EINVAL;
|
|
@@ -6261,7 +6264,9 @@ static int sctp_getsockopt_active_key(struct sock *sk, int len,
|
|
|
|
|
|
if (len < sizeof(struct sctp_authkeyid))
|
|
|
return -EINVAL;
|
|
|
- if (copy_from_user(&val, optval, sizeof(struct sctp_authkeyid)))
|
|
|
+
|
|
|
+ len = sizeof(struct sctp_authkeyid);
|
|
|
+ if (copy_from_user(&val, optval, len))
|
|
|
return -EFAULT;
|
|
|
|
|
|
asoc = sctp_id2assoc(sk, val.scact_assoc_id);
|
|
@@ -6273,7 +6278,6 @@ static int sctp_getsockopt_active_key(struct sock *sk, int len,
|
|
|
else
|
|
|
val.scact_keynumber = ep->active_key_id;
|
|
|
|
|
|
- len = sizeof(struct sctp_authkeyid);
|
|
|
if (put_user(len, optlen))
|
|
|
return -EFAULT;
|
|
|
if (copy_to_user(optval, &val, len))
|
|
@@ -6299,7 +6303,7 @@ static int sctp_getsockopt_peer_auth_chunks(struct sock *sk, int len,
|
|
|
if (len < sizeof(struct sctp_authchunks))
|
|
|
return -EINVAL;
|
|
|
|
|
|
- if (copy_from_user(&val, optval, sizeof(struct sctp_authchunks)))
|
|
|
+ if (copy_from_user(&val, optval, sizeof(val)))
|
|
|
return -EFAULT;
|
|
|
|
|
|
to = p->gauth_chunks;
|
|
@@ -6344,7 +6348,7 @@ static int sctp_getsockopt_local_auth_chunks(struct sock *sk, int len,
|
|
|
if (len < sizeof(struct sctp_authchunks))
|
|
|
return -EINVAL;
|
|
|
|
|
|
- if (copy_from_user(&val, optval, sizeof(struct sctp_authchunks)))
|
|
|
+ if (copy_from_user(&val, optval, sizeof(val)))
|
|
|
return -EFAULT;
|
|
|
|
|
|
to = p->gauth_chunks;
|