ChenXiaoSong 001c179c4e xfs: fix NULL pointer dereference in xfs_getbmap()
Reproducer:
 1. fallocate -l 100M image
 2. mkfs.xfs -f image
 3. mount image /mnt
 4. setxattr("/mnt", "trusted.overlay.upper", NULL, 0, XATTR_CREATE)
 5. char arg[32] = "\x01\xff\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00"
                   "\x00\x00\x00\x00\x00\x08\x00\x00\x00\xc6\x2a\xf7";
    fd = open("/mnt", O_RDONLY|O_DIRECTORY);
    ioctl(fd, _IOC(_IOC_READ|_IOC_WRITE, 0x58, 0x2c, 0x20), arg);

NULL pointer dereference will occur when race happens between xfs_getbmap()
and xfs_bmap_set_attrforkoff():

         ioctl               |       setxattr
 ----------------------------|---------------------------
 xfs_getbmap                 |
   xfs_ifork_ptr             |
     xfs_inode_has_attr_fork |
       ip->i_forkoff == 0    |
     return NULL             |
   ifp == NULL               |
                             | xfs_bmap_set_attrforkoff
                             |   ip->i_forkoff > 0
   xfs_inode_has_attr_fork   |
     ip->i_forkoff > 0       |
   ifp == NULL               |
   ifp->if_format            |

Fix this by locking i_lock before xfs_ifork_ptr().

Fixes: abbf9e8a4507 ("xfs: rewrite getbmap using the xfs_iext_* helpers")
Signed-off-by: ChenXiaoSong <chenxiaosong2@huawei.com>
Signed-off-by: Guo Xuenan <guoxuenan@huawei.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
[djwong: added fixes tag]
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
2022-07-31 09:21:27 -07:00
..
2022-07-22 10:58:39 -07:00
2022-01-15 16:30:29 +02:00
2021-10-22 16:00:31 -07:00
2022-07-14 11:47:42 +10:00
2022-04-26 13:34:42 +10:00
2022-05-24 19:55:07 -07:00
2022-04-01 19:30:44 -07:00
2022-07-22 10:58:39 -07:00
2022-05-11 17:01:23 +10:00
2022-06-01 17:23:53 -07:00
2022-05-11 17:01:22 +10:00
2022-06-23 13:34:38 -07:00
2022-07-14 09:46:37 -07:00
2022-07-14 09:46:37 -07:00
2021-12-04 08:58:53 -08:00
2022-07-14 09:46:37 -07:00
2021-01-24 14:43:46 +01:00
2022-05-11 17:01:22 +10:00
2022-05-11 17:01:22 +10:00
2022-07-14 09:46:37 -07:00
2021-08-19 10:07:14 -07:00