[PATCH] cpuset read past eof memory leak fix
authorPaul Jackson <pj@sgi.com>
Wed, 28 Sep 2005 13:42:24 +0000 (06:42 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Wed, 28 Sep 2005 14:58:51 +0000 (07:58 -0700)
Don't leak a page of memory if user reads a cpuset file past eof.

Signed-off-by: KUROSAWA Takahiro <kurosawa@valinux.co.jp>
Signed-off-by: Paul Jackson <pj@sgi.com>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
kernel/cpuset.c

index 79866bc6b3a154d06c4b42daa3daec60aa96ebd9..6a6e87b2f2fd0d245aaf48a9a42a07e4bbe9dd83 100644 (file)
@@ -969,7 +969,7 @@ static ssize_t cpuset_common_file_read(struct file *file, char __user *buf,
        ssize_t retval = 0;
        char *s;
        char *start;
-       size_t n;
+       ssize_t n;
 
        if (!(page = (char *)__get_free_page(GFP_KERNEL)))
                return -ENOMEM;
@@ -999,12 +999,13 @@ static ssize_t cpuset_common_file_read(struct file *file, char __user *buf,
        *s++ = '\n';
        *s = '\0';
 
-       /* Do nothing if *ppos is at the eof or beyond the eof. */
-       if (s - page <= *ppos)
-               return 0;
-
        start = page + *ppos;
        n = s - start;
+
+       /* Do nothing if *ppos is at the eof or beyond the eof. */
+       if (n <= 0)
+               goto out;
+
        retval = n - copy_to_user(buf, start, min(n, nbytes));
        *ppos += retval;
 out: