]> err.no Git - linux-2.6/commitdiff
udf: Fix memory corruption when fs mounted with noadinicb option
authorJan Kara <jack@ghost.suse.cz>
Tue, 6 May 2008 16:26:17 +0000 (18:26 +0200)
committerJan Kara <jack@suse.cz>
Wed, 7 May 2008 07:49:52 +0000 (09:49 +0200)
When UDF filesystem is mounted with noadinicb mount option, it
happens that we extend an empty directory with a block. A code in
udf_add_entry() didn't count with this possibility and used
uninitialized data leading to memory and filesystem corruption.
Add a check whether file already has some extents before operating
on them.

Signed-off-by: Jan Kara <jack@suse.cz>
fs/udf/namei.c

index 47a6589e10b5ce984a988c2f3332fb12c891aa1c..3d94bc1cfbaf44b11280a8e374ef9c92f76030ec 100644 (file)
@@ -315,7 +315,7 @@ static struct fileIdentDesc *udf_add_entry(struct inode *dir,
        uint16_t liu;
        int block;
        kernel_lb_addr eloc;
-       uint32_t elen;
+       uint32_t elen = 0;
        sector_t offset;
        struct extent_position epos = {};
        struct udf_inode_info *dinfo;
@@ -406,7 +406,8 @@ static struct fileIdentDesc *udf_add_entry(struct inode *dir,
        }
 
 add:
-       if (dinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) {
+       /* Is there any extent whose size we need to round up? */
+       if (dinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB && elen) {
                elen = (elen + sb->s_blocksize - 1) & ~(sb->s_blocksize - 1);
                if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
                        epos.offset -= sizeof(short_ad);