diff options
Diffstat (limited to 'fs/jffs2')
| -rw-r--r-- | fs/jffs2/read.c | 9 | 
1 files changed, 6 insertions, 3 deletions
| diff --git a/fs/jffs2/read.c b/fs/jffs2/read.c index cfe05c1966a5..3f39be1b0455 100644 --- a/fs/jffs2/read.c +++ b/fs/jffs2/read.c @@ -164,12 +164,15 @@ int jffs2_read_inode_range(struct jffs2_sb_info *c, struct jffs2_inode_info *f,  	/* XXX FIXME: Where a single physical node actually shows up in two  	   frags, we read it twice. Don't do that. */ -	/* Now we're pointing at the first frag which overlaps our page */ +	/* Now we're pointing at the first frag which overlaps our page +	 * (or perhaps is before it, if we've been asked to read off the +	 * end of the file). */  	while(offset < end) {  		D2(printk(KERN_DEBUG "jffs2_read_inode_range: offset %d, end %d\n", offset, end)); -		if (unlikely(!frag || frag->ofs > offset)) { +		if (unlikely(!frag || frag->ofs > offset || +			     frag->ofs + frag->size <= offset)) {  			uint32_t holesize = end - offset; -			if (frag) { +			if (frag && frag->ofs > offset) {  				D1(printk(KERN_NOTICE "Eep. Hole in ino #%u fraglist. frag->ofs = 0x%08x, offset = 0x%08x\n", f->inocache->ino, frag->ofs, offset));  				holesize = min(holesize, frag->ofs - offset);  			} | 
