| From: Al Viro <viro@zeniv.linux.org.uk> |
| Date: Thu, 17 May 2018 17:18:30 -0400 |
| Subject: ext2: fix a block leak |
| |
| commit 5aa1437d2d9a068c0334bd7c9dafa8ec4f97f13b upstream. |
| |
| open file, unlink it, then use ioctl(2) to make it immutable or |
| append only. Now close it and watch the blocks *not* freed... |
| |
| Immutable/append-only checks belong in ->setattr(). |
| Note: the bug is old and backport to anything prior to 737f2e93b972 |
| ("ext2: convert to use the new truncate convention") will need |
| these checks lifted into ext2_setattr(). |
| |
| Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> |
| [bwh: Backported to 3.16: adjust context] |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| fs/ext2/inode.c | 10 ---------- |
| 1 file changed, 10 deletions(-) |
| |
| --- a/fs/ext2/inode.c |
| +++ b/fs/ext2/inode.c |
| @@ -1169,21 +1169,11 @@ do_indirects: |
| |
| static void ext2_truncate_blocks(struct inode *inode, loff_t offset) |
| { |
| - /* |
| - * XXX: it seems like a bug here that we don't allow |
| - * IS_APPEND inode to have blocks-past-i_size trimmed off. |
| - * review and fix this. |
| - * |
| - * Also would be nice to be able to handle IO errors and such, |
| - * but that's probably too much to ask. |
| - */ |
| if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || |
| S_ISLNK(inode->i_mode))) |
| return; |
| if (ext2_inode_is_fast_symlink(inode)) |
| return; |
| - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) |
| - return; |
| __ext2_truncate_blocks(inode, offset); |
| } |
| |