diff options
| author | root <ngkaho1234@gmail.com> | 2015-10-06 12:43:15 +0000 |
|---|---|---|
| committer | root <ngkaho1234@gmail.com> | 2015-10-06 12:43:15 +0000 |
| commit | 0226bd4bb492f371832bd791faa83029b2298248 (patch) | |
| tree | 0d70f7f40c7fe924b7d55e3ceea2ed23768ce646 | |
| parent | 6de80f736dbaff57b01154597dd4776b031ec347 (diff) | |
FIX: the ext4_block reference is freed before the EA data is put onto the acl block.
| -rw-r--r-- | lwext4/ext4_xattr.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/lwext4/ext4_xattr.c b/lwext4/ext4_xattr.c index a9e6cce..ebb22f6 100644 --- a/lwext4/ext4_xattr.c +++ b/lwext4/ext4_xattr.c @@ -505,7 +505,7 @@ ext4_xattr_try_alloc_block(struct ext4_xattr_ref *xattr_ref) { int ret = EOK; - uint64_t xattr_block; + uint64_t xattr_block = 0; xattr_block = ext4_inode_get_file_acl(xattr_ref->inode_ref->inode, &xattr_ref->fs->sb); if (!xattr_block) { @@ -529,7 +529,7 @@ ext4_xattr_try_alloc_block(struct ext4_xattr_ref *xattr_ref) xattr_ref->inode_ref->dirty = true; xattr_ref->block_loaded = true; xattr_ref->ea_size += sizeof(struct ext4_xattr_header); -} + } Finish: return ret; @@ -615,6 +615,10 @@ ext4_xattr_write_to_disk(struct ext4_xattr_ref *xattr_ref) block_entry = EXT4_XATTR_BFIRST(&xattr_ref->block); block_data = (char *)header + block_size_rem; block_size_rem -= sizeof(struct ext4_xattr_header); + ext4_inode_set_file_acl(xattr_ref->inode_ref->inode, + &xattr_ref->fs->sb, + 0); + xattr_ref->inode_ref->dirty = true; } } } @@ -777,7 +781,7 @@ int ext4_fs_get_xattr_ref(struct ext4_fs *fs, ref->ea_size = 0; if (xattr_block) { rc = ext4_block_get(fs->bdev, - &inode_ref->block, xattr_block); + &ref->block, xattr_block); if (rc != EOK) return EIO; @@ -807,11 +811,11 @@ int ext4_fs_get_xattr_ref(struct ext4_fs *fs, void ext4_fs_put_xattr_ref(struct ext4_xattr_ref *ref) { + ext4_xattr_write_to_disk(ref); if (ref->block_loaded) { ext4_block_set(ref->fs->bdev, &ref->block); ref->block_loaded = false; } - ext4_xattr_write_to_disk(ref); ext4_xattr_purge_items(ref); ref->inode_ref = NULL; ref->fs = NULL; |
