aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs
diff options
context:
space:
mode:
authorShan Hai <shan.hai@oracle.com>2018-08-10 20:55:55 -0400
committerDarrick J. Wong <darrick.wong@oracle.com>2018-08-12 11:37:31 -0400
commit01239d77b9dd978863d1a75f0d095ab942a1fe66 (patch)
tree886481f2e5c89103b06d6827486d9351b0051dfa /fs/xfs
parentfa6c668d807b1e9ac041101dfcb59bd8e279cfe5 (diff)
xfs: fix a null pointer dereference in xfs_bmap_extents_to_btree
Fuzzing tool reports a write to null pointer error in the xfs_bmap_extents_to_btree, fix it by bailing out on encountering a null pointer. Signed-off-by: Shan Hai <shan.hai@oracle.com> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Diffstat (limited to 'fs/xfs')
-rw-r--r--fs/xfs/libxfs/xfs_bmap.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c
index 5648a177e0ac..2760314fdf7f 100644
--- a/fs/xfs/libxfs/xfs_bmap.c
+++ b/fs/xfs/libxfs/xfs_bmap.c
@@ -712,19 +712,14 @@ xfs_bmap_extents_to_btree(
712 args.wasdel = wasdel; 712 args.wasdel = wasdel;
713 *logflagsp = 0; 713 *logflagsp = 0;
714 if ((error = xfs_alloc_vextent(&args))) { 714 if ((error = xfs_alloc_vextent(&args))) {
715 xfs_iroot_realloc(ip, -1, whichfork);
716 ASSERT(ifp->if_broot == NULL); 715 ASSERT(ifp->if_broot == NULL);
717 XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_EXTENTS); 716 goto err1;
718 xfs_btree_del_cursor(cur, XFS_BTREE_ERROR);
719 return error;
720 } 717 }
721 718
722 if (WARN_ON_ONCE(args.fsbno == NULLFSBLOCK)) { 719 if (WARN_ON_ONCE(args.fsbno == NULLFSBLOCK)) {
723 xfs_iroot_realloc(ip, -1, whichfork);
724 ASSERT(ifp->if_broot == NULL); 720 ASSERT(ifp->if_broot == NULL);
725 XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_EXTENTS); 721 error = -ENOSPC;
726 xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); 722 goto err1;
727 return -ENOSPC;
728 } 723 }
729 /* 724 /*
730 * Allocation can't fail, the space was reserved. 725 * Allocation can't fail, the space was reserved.
@@ -736,6 +731,10 @@ xfs_bmap_extents_to_btree(
736 ip->i_d.di_nblocks++; 731 ip->i_d.di_nblocks++;
737 xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, 1L); 732 xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, 1L);
738 abp = xfs_btree_get_bufl(mp, tp, args.fsbno, 0); 733 abp = xfs_btree_get_bufl(mp, tp, args.fsbno, 0);
734 if (!abp) {
735 error = -ENOSPC;
736 goto err2;
737 }
739 /* 738 /*
740 * Fill in the child block. 739 * Fill in the child block.
741 */ 740 */
@@ -775,6 +774,15 @@ xfs_bmap_extents_to_btree(
775 *curp = cur; 774 *curp = cur;
776 *logflagsp = XFS_ILOG_CORE | xfs_ilog_fbroot(whichfork); 775 *logflagsp = XFS_ILOG_CORE | xfs_ilog_fbroot(whichfork);
777 return 0; 776 return 0;
777
778err2:
779 xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, -1L);
780err1:
781 xfs_iroot_realloc(ip, -1, whichfork);
782 XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_EXTENTS);
783 xfs_btree_del_cursor(cur, XFS_BTREE_ERROR);
784
785 return error;
778} 786}
779 787
780/* 788/*