Fixes VFS generic_file_read with too large offsets
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 22 Jul 2014 04:47:50 +0000 (21:47 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 22 Jul 2014 04:47:50 +0000 (21:47 -0700)
If offset is greater than the file size, we should return 0.

We had another bug causing large offsets, and when offset was greater
than the filesize, count would be < 0.  Definite trouble.

kern/src/vfs.c

index 96638e7..358010e 100644 (file)
@@ -1158,12 +1158,13 @@ ssize_t generic_file_read(struct file *file, char *buf, size_t count,
        /* Consider pushing some error checking higher in the VFS */
        if (!count)
                return 0;
-       if (*offset == file->f_dentry->d_inode->i_size)
+       if (*offset >= file->f_dentry->d_inode->i_size)
                return 0; /* EOF */
        /* Make sure we don't go past the end of the file */
        if (*offset + count > file->f_dentry->d_inode->i_size) {
                count = file->f_dentry->d_inode->i_size - *offset;
        }
+       assert((long)count > 0);
        page_off = *offset & (PGSIZE - 1);
        first_idx = *offset >> PGSHIFT;
        last_idx = (*offset + count) >> PGSHIFT;