Negative offset may cause loop device size larger than backing file
size.

 $ fallocate -l 1M a
 $ losetup --offset 0xffffffffffff0000 /dev/loop0 a
 $ blockdev --getsize64 /dev/loop0
 1114112
 $ ls -l a
 -rw-r--r-- 1 root root 1048576 Jan 23 12:46 a
 $ cat /dev/loop0
 cat: /dev/loop0: Input/output error

It makes no sense to do that. Only apply offset when it's positive.

Fix a typo in the comment by the way.

Signed-off-by: Guo Chao <y...@linux.vnet.ibm.com>
---
 drivers/block/loop.c |    9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 9190a82..7a235db 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -162,12 +162,13 @@ static struct loop_func_table *xfer_funcs[MAX_LO_CRYPT] = 
{
 
 static loff_t get_size(loff_t offset, loff_t sizelimit, struct file *file)
 {
-       loff_t size, loopsize;
+       loff_t loopsize;
 
        /* Compute loopsize in bytes */
-       size = i_size_read(file->f_mapping->host);
-       loopsize = size - offset;
-       /* offset is beyond i_size, wierd but possible */
+       loopsize = i_size_read(file->f_mapping->host);
+       if (offset > 0)
+               loopsize -= offset;
+       /* offset is beyond i_size, weird but possible */
        if (loopsize < 0)
                return 0;
 
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to