erofs: fix extended inode could cross boundary
authorGao Xiang <hsiangkao@redhat.com>
Wed, 29 Jul 2020 17:58:01 +0000 (01:58 +0800)
committerGao Xiang <hsiangkao@redhat.com>
Mon, 3 Aug 2020 13:04:46 +0000 (21:04 +0800)
commit0dcd3c94e02438f4a571690e26f4ee997524102a
treecdcedf2bdad9591b78c6eddfec85476a1c47629a
parent592e7cd00bb9d48742ff402b74b79244e4a765dd
erofs: fix extended inode could cross boundary

Each ondisk inode should be aligned with inode slot boundary
(32-byte alignment) because of nid calculation formula, so all
compact inodes (32 byte) cannot across page boundary. However,
extended inode is now 64-byte form, which can across page boundary
in principle if the location is specified on purpose, although
it's hard to be generated by mkfs due to the allocation policy
and rarely used by Android use case now mainly for > 4GiB files.

For now, only two fields `i_ctime_nsec` and `i_nlink' couldn't
be read from disk properly and cause out-of-bound memory read
with random value.

Let's fix now.

Fixes: 431339ba9042 ("staging: erofs: add inode operations")
Cc: <stable@vger.kernel.org> # 4.19+
Link: https://lore.kernel.org/r/20200729175801.GA23973@xiangao.remote.csb
Reviewed-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Gao Xiang <hsiangkao@redhat.com>
fs/erofs/inode.c