diff options
author | Jan Kara <jack@ghost.suse.cz> | 2008-05-06 18:26:17 +0200 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2008-05-07 09:49:52 +0200 |
commit | 9afadc4b1fd25337003832c9a4668f9bd42cdda9 (patch) | |
tree | 45f0ce3a176c3562ff308189ced71ebb6f0a1110 /fs/udf | |
parent | 221e583a735fc5d879d83c2a76b8ee5afcbdf146 (diff) | |
download | lwn-9afadc4b1fd25337003832c9a4668f9bd42cdda9.tar.gz lwn-9afadc4b1fd25337003832c9a4668f9bd42cdda9.zip |
udf: Fix memory corruption when fs mounted with noadinicb option
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>
Diffstat (limited to 'fs/udf')
-rw-r--r-- | fs/udf/namei.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/fs/udf/namei.c b/fs/udf/namei.c index 47a6589e10b5..3d94bc1cfbaf 100644 --- a/fs/udf/namei.c +++ b/fs/udf/namei.c @@ -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); |