fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / fs / isofs / compress.c
index 877b4e4..6bbbdb5 100644 (file)
  * Transparent decompression of files on an iso9660 filesystem
  */
 
-#include <linux/config.h>
 #include <linux/module.h>
-
-#include <linux/stat.h>
-#include <linux/time.h>
-#include <linux/iso_fs.h>
-#include <linux/kernel.h>
-#include <linux/major.h>
-#include <linux/mm.h>
-#include <linux/string.h>
-#include <linux/slab.h>
-#include <linux/errno.h>
-#include <linux/cdrom.h>
 #include <linux/init.h>
-#include <linux/nls.h>
-#include <linux/ctype.h>
-#include <linux/smp_lock.h>
-#include <linux/blkdev.h>
+
 #include <linux/vmalloc.h>
 #include <linux/zlib.h>
-#include <linux/buffer_head.h>
-
-#include <asm/system.h>
-#include <asm/uaccess.h>
-#include <asm/semaphore.h>
 
+#include "isofs.h"
 #include "zisofs.h"
 
 /* This should probably be global. */
@@ -61,7 +42,7 @@ static struct semaphore zisofs_zlib_semaphore;
  */
 static int zisofs_readpage(struct file *file, struct page *page)
 {
-       struct inode *inode = file->f_dentry->d_inode;
+       struct inode *inode = file->f_path.dentry->d_inode;
        struct address_space *mapping = inode->i_mapping;
        unsigned int maxpage, xpage, fpage, blockindex;
        unsigned long offset;
@@ -132,7 +113,7 @@ static int zisofs_readpage(struct file *file, struct page *page)
                        brelse(ptrbh[1]);
                goto eio;
        }
-       cstart = le32_to_cpu(*(u32 *)(bh->b_data + (blockptr & bufmask)));
+       cstart = le32_to_cpu(*(__le32 *)(bh->b_data + (blockptr & bufmask)));
 
        if ( indexblocks == 2 ) {
                /* We just crossed a block boundary.  Switch to the next block */
@@ -144,11 +125,17 @@ static int zisofs_readpage(struct file *file, struct page *page)
                        goto eio;
                }
        }
-       cend = le32_to_cpu(*(u32 *)(bh->b_data + (blockendptr & bufmask)));
+       cend = le32_to_cpu(*(__le32 *)(bh->b_data + (blockendptr & bufmask)));
        brelse(bh);
 
+       if (cstart > cend)
+               goto eio;
+               
        csize = cend-cstart;
 
+       if (csize > deflateBound(1UL << zisofs_block_shift))
+               goto eio;
+
        /* Now page[] contains an array of pages, any of which can be NULL,
           and the locks on which we hold.  We should now read the data and
           release the pages.  If the pages are NULL the decompressed data
@@ -324,7 +311,7 @@ eio:
        return err;
 }
 
-struct address_space_operations zisofs_aops = {
+const struct address_space_operations zisofs_aops = {
        .readpage = zisofs_readpage,
        /* No sync_page operation supported? */
        /* No bmap operation supported */