

do-readv_writev() is trying to fail if

a) any of the segments have a length < 0 or

b) the sum of the segments wraps negative.

But it gets b) wrong because local variable tot_len is unsigned.

Fix that up.


---

 25-akpm/fs/read_write.c |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff -puN fs/read_write.c~readv-writev-check-fix fs/read_write.c
--- 25/fs/read_write.c~readv-writev-check-fix	2004-04-03 02:59:57.015685240 -0800
+++ 25-akpm/fs/read_write.c	2004-04-03 02:59:57.018684784 -0800
@@ -412,13 +412,13 @@ static ssize_t do_readv_writev(int type,
 	 */
 	tot_len = 0;
 	ret = -EINVAL;
-	for (seg = 0 ; seg < nr_segs; seg++) {
-		ssize_t tmp = tot_len;
+	for (seg = 0; seg < nr_segs; seg++) {
 		ssize_t len = (ssize_t)iov[seg].iov_len;
+
 		if (len < 0)	/* size_t not fitting an ssize_t .. */
 			goto out;
 		tot_len += len;
-		if (tot_len < tmp) /* maths overflow on the ssize_t */
+		if ((ssize_t)tot_len < 0) /* maths overflow on the ssize_t */
 			goto out;
 	}
 	if (tot_len == 0) {

_
