Jörn

-- 
Rules of Optimization:
Rule 1: Don't do it.
Rule 2 (for experts only): Don't do it yet.
-- M.A. Jackson 


Signed-off-by: Jörn Engel <[EMAIL PROTECTED]>
---

 fs/squashfs/inode.c |   20 +++++++++++++++-----
 1 files changed, 15 insertions(+), 5 deletions(-)

--- linux-2.6.12-rc2cow/fs/squashfs/inode.c~squashfs_cu2        2005-04-20 
08:11:10.000000000 +0200
+++ linux-2.6.12-rc2cow/fs/squashfs/inode.c     2005-04-20 16:34:43.619956672 
+0200
@@ -1453,11 +1453,14 @@ static int squashfs_readdir(struct file 
                next_offset = SQUASHFS_I(i)->offset, length = 0, dirs_read = 0,
                dir_count;
        squashfs_dir_header dirh;
-       char buffer[sizeof(squashfs_dir_entry) + SQUASHFS_NAME_LEN + 1];
-       squashfs_dir_entry *dire = (squashfs_dir_entry *) buffer;
+       squashfs_dir_entry *dire;
 
        TRACE("Entered squashfs_readdir [%x:%x]\n", next_block, next_offset);
 
+       dire = kmalloc(sizeof(*dire) + SQUASHFS_NAME_LEN + 1, GFP_KERNEL);
+       if (!dire)
+               return -ENOMEM;
+
        length = get_dir_index_using_offset(i->i_sb, &next_block, &next_offset,
                                SQUASHFS_I(i)->u.s2.directory_index_start,
                                SQUASHFS_I(i)->u.s2.directory_index_offset,
@@ -1533,6 +1536,7 @@ static int squashfs_readdir(struct file 
                                        squashfs_filetype_table[dire->type])
                                        < 0) {
                                TRACE("Filldir returned less than 0\n");
+                               kfree(dire);
                                return dirs_read;
                        }
                        file->f_pos = length;
@@ -1540,11 +1544,13 @@ static int squashfs_readdir(struct file 
                }
        }
 
+       kfree(dire);
        return dirs_read;
 
 failed_read:
        ERROR("Unable to read directory block [%x:%x]\n", next_block,
                next_offset);
+       kfree(dire);
        return 0;
 }
 
@@ -1562,12 +1568,15 @@ static struct dentry *squashfs_lookup(st
                                next_offset = SQUASHFS_I(i)->offset, length = 0,
                                dir_count;
        squashfs_dir_header dirh;
-       char buffer[sizeof(squashfs_dir_entry) + SQUASHFS_NAME_LEN];
-       squashfs_dir_entry *dire = (squashfs_dir_entry *) buffer;
+       squashfs_dir_entry *dire;
        int sorted = sBlk->s_major == 2 && sBlk->s_minor >= 1;
 
        TRACE("Entered squashfs_lookup [%x:%x]\n", next_block, next_offset);
 
+       dire = kmalloc(sizeof(*dire) + SQUASHFS_NAME_LEN + 1, GFP_KERNEL);
+       if (!dire)
+               return ERR_PTR(-ENOMEM);
+
        length = get_dir_index_using_name(i->i_sb, &next_block, &next_offset,
                                SQUASHFS_I(i)->u.s2.directory_index_start,
                                SQUASHFS_I(i)->u.s2.directory_index_offset,
@@ -1645,7 +1654,8 @@ static struct dentry *squashfs_lookup(st
 
 exit_loop:
        d_add(dentry, inode);
-       return ERR_PTR(0);
+       kfree(dire);
+       return NULL;
 
 failed_read:
        ERROR("Unable to read directory block [%x:%x]\n", next_block,
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
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