From: Shan Hai <shan.hai@oracle.com>
To: "Darrick J. Wong" <darrick.wong@oracle.com>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH 1/1] xfs: fix a null pointer dereference in xfs_bmap_extents_to_btree
Date: Wed, 18 Apr 2018 10:41:01 +0800 [thread overview]
Message-ID: <49bd78f6-8c4d-c51a-6fa1-02529f0da7ca@oracle.com> (raw)
In-Reply-To: <20180418022426.GL24738@magnolia>
On 2018年04月18日 10:24, Darrick J. Wong wrote:
> On Wed, Apr 18, 2018 at 10:13:22AM +0800, Shan Hai wrote:
>>
>> On 2018年04月18日 10:09, Shan Hai wrote:
>>> 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>
>> This one supposed to be applied on top of below:
>>
>> https://www.spinics.net/lists/linux-xfs/msg17254.html
>> [PATCH] xfs: set format back to extents if xfs_bmap_extents_to_btree fails
>>
>> Thanks
>> Shan Hai
>>> ---
>>> fs/xfs/libxfs/xfs_bmap.c | 24 ++++++++++++++++--------
>>> 1 file changed, 16 insertions(+), 8 deletions(-)
>>>
>>> diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c
>>> index 040eeda..90b743d 100644
>>> --- a/fs/xfs/libxfs/xfs_bmap.c
>>> +++ b/fs/xfs/libxfs/xfs_bmap.c
>>> @@ -724,19 +724,14 @@ xfs_bmap_extents_to_btree(
>>> args.wasdel = wasdel;
>>> *logflagsp = 0;
>>> if ((error = xfs_alloc_vextent(&args))) {
>>> - xfs_iroot_realloc(ip, -1, whichfork);
>>> ASSERT(ifp->if_broot == NULL);
>>> - XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_EXTENTS);
>>> - xfs_btree_del_cursor(cur, XFS_BTREE_ERROR);
>>> - return error;
>>> + goto err1;
>>> }
>>> if (WARN_ON_ONCE(args.fsbno == NULLFSBLOCK)) {
>>> - xfs_iroot_realloc(ip, -1, whichfork);
>>> ASSERT(ifp->if_broot == NULL);
>>> - XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_EXTENTS);
>>> - xfs_btree_del_cursor(cur, XFS_BTREE_ERROR);
>>> - return -ENOSPC;
>>> + error = -ENOSPC;
>>> + goto err1;
>>> }
>>> /*
>>> * Allocation can't fail, the space was reserved.
>>> @@ -748,6 +743,10 @@ xfs_bmap_extents_to_btree(
>>> ip->i_d.di_nblocks++;
>>> xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, 1L);
>>> abp = xfs_btree_get_bufl(mp, tp, args.fsbno, 0);
>>> + if (!abp) {
> When does this happen? We got args.fsbno from the allocator, so we're
> not out of space. Or are you saying that something fuzzed the free
> space btree, therefore the allocator gave back a nonsense block number
> (say pointing past the end of the fs), and therefore the _get_bufl call
> returned NULL?
Seems the memory page allocation fails and the xfs_btree_get_bufl
returns NULL, but I have no reliable reproducer, sorry.
Thanks
Shan Hai
> If so, maybe we need to change that WARN_ON_ONCE thing above to:
>
> if (WARN_ON_ONCE(...) || !xfs_verify_fsbno(..., args.fsbno)) {
> /* undo state and return */
> }
>
> --D
>
>>> + error = -ENOSPC;
>>> + goto err2;
>>> + }
>>> /*
>>> * Fill in the child block.
>>> */
>>> @@ -787,6 +786,15 @@ xfs_bmap_extents_to_btree(
>>> *curp = cur;
>>> *logflagsp = XFS_ILOG_CORE | xfs_ilog_fbroot(whichfork);
>>> return 0;
>>> +
>>> +err2:
>>> + xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, -1L);
>>> +err1:
>>> + xfs_iroot_realloc(ip, -1, whichfork);
>>> + XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_EXTENTS);
>>> + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR);
>>> +
>>> + return error;
>>> }
>>> /*
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2018-04-18 2:41 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-04-18 2:09 [PATCH 1/1] xfs: fix a null pointer dereference in xfs_bmap_extents_to_btree Shan Hai
2018-04-18 2:13 ` Shan Hai
2018-04-18 2:24 ` Darrick J. Wong
2018-04-18 2:41 ` Shan Hai [this message]
2018-04-19 1:18 ` Shan Hai
2018-08-11 0:48 ` Darrick J. Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=49bd78f6-8c4d-c51a-6fa1-02529f0da7ca@oracle.com \
--to=shan.hai@oracle.com \
--cc=darrick.wong@oracle.com \
--cc=linux-xfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).