Commit 1de51f37 authored by Alan Cox's avatar Alan Cox Committed by Linus Torvalds

[PATCH] SuS/LSB compliance in readv/writev from 2.4

parent 151eb016
...@@ -301,17 +301,23 @@ static ssize_t do_readv_writev(int type, struct file *file, ...@@ -301,17 +301,23 @@ static ssize_t do_readv_writev(int type, struct file *file,
if (copy_from_user(iov, vector, count*sizeof(*vector))) if (copy_from_user(iov, vector, count*sizeof(*vector)))
goto out; goto out;
/* BSD readv/writev returns EINVAL if one of the iov_len /*
values < 0 or tot_len overflowed a 32-bit integer. -ink */ * Single unix specification:
* We should -EINVAL if an element length is not >= 0 and fitting an ssize_t
* The total length is fitting an ssize_t
*
* Be careful here because iov_len is a size_t not an ssize_t
*/
tot_len = 0; tot_len = 0;
ret = -EINVAL; ret = -EINVAL;
for (i = 0 ; i < count ; i++) { for (i = 0 ; i < count ; i++) {
size_t tmp = tot_len; ssize_t tmp = tot_len;
int len = iov[i].iov_len; ssize_t len = (ssize_t)iov[i].iov_len;
if (len < 0) if (len < 0) /* size_t not fitting an ssize_t .. */
goto out; goto out;
(u32)tot_len += len; tot_len += len;
if (tot_len < tmp || tot_len < (u32)len) if (tot_len < tmp) /* maths overflow on the ssize_t */
goto out; goto out;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment