From: Christoph Hellwig <hch@lst.de>
To: "Darrick J. Wong" <darrick.wong@oracle.com>
Cc: linux-xfs@vger.kernel.org, david@fromorbit.com, hch@lst.de,
Brian Foster <bfoster@redhat.com>
Subject: Re: [PATCH v5.2 3/3] xfs: fix an incore inode UAF in xfs_bui_recover
Date: Fri, 2 Oct 2020 09:30:06 +0200 [thread overview]
Message-ID: <20201002073006.GE9900@lst.de> (raw)
In-Reply-To: <20201002042236.GV49547@magnolia>
On Thu, Oct 01, 2020 at 09:22:36PM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
>
> In xfs_bui_item_recover, there exists a use-after-free bug with regards
> to the inode that is involved in the bmap replay operation. If the
> mapping operation does not complete, we call xfs_bmap_unmap_extent to
> create a deferred op to finish the unmapping work, and we retain a
> pointer to the incore inode.
>
> Unfortunately, the very next thing we do is commit the transaction and
> drop the inode. If reclaim tears down the inode before we try to finish
> the defer ops, we dereference garbage and blow up. Therefore, create a
> way to join inodes to the defer ops freezer so that we can maintain the
> xfs_inode reference until we're done with the inode.
>
> Note: This imposes the requirement that there be enough memory to keep
> every incore inode in memory throughout recovery.
>
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---
> v5.2: rebase on updated defer capture patches
> ---
> fs/xfs/libxfs/xfs_defer.c | 55 ++++++++++++++++++++++++++++++++++++++------
> fs/xfs/libxfs/xfs_defer.h | 11 +++++++--
> fs/xfs/xfs_bmap_item.c | 8 ++----
> fs/xfs/xfs_extfree_item.c | 2 +-
> fs/xfs/xfs_log_recover.c | 7 +++++-
> fs/xfs/xfs_refcount_item.c | 2 +-
> fs/xfs/xfs_rmap_item.c | 2 +-
> 7 files changed, 67 insertions(+), 20 deletions(-)
>
> diff --git a/fs/xfs/libxfs/xfs_defer.c b/fs/xfs/libxfs/xfs_defer.c
> index e19dc1ced7e6..4af5752f9830 100644
> --- a/fs/xfs/libxfs/xfs_defer.c
> +++ b/fs/xfs/libxfs/xfs_defer.c
> @@ -16,6 +16,7 @@
> #include "xfs_inode.h"
> #include "xfs_inode_item.h"
> #include "xfs_trace.h"
> +#include "xfs_icache.h"
>
> /*
> * Deferred Operations in XFS
> @@ -553,10 +554,14 @@ xfs_defer_move(
> * deferred ops state is transferred to the capture structure and the
> * transaction is then ready for the caller to commit it. If there are no
> * intent items to capture, this function returns NULL.
> + *
> + * If inodes are passed in and this function returns a capture structure, the
> + * inodes are now owned by the capture structure.
> */
> static struct xfs_defer_capture *
> xfs_defer_ops_capture(
> - struct xfs_trans *tp)
> + struct xfs_trans *tp,
> + struct xfs_inode *ip)
> {
> struct xfs_defer_capture *dfc;
>
> @@ -582,6 +587,12 @@ xfs_defer_ops_capture(
> /* Preserve the log reservation size. */
> dfc->dfc_logres = tp->t_log_res;
>
> + /*
> + * Transfer responsibility for unlocking and releasing the inodes to
> + * the capture structure.
> + */
> + dfc->dfc_ip = ip;
> +
Maybe rename ip to capture_ip?
> + ASSERT(ip == NULL || xfs_isilocked(ip, XFS_ILOCK_EXCL));
> +
> /* If we don't capture anything, commit transaction and exit. */
> + dfc = xfs_defer_ops_capture(tp, ip);
> + if (!dfc) {
> + error = xfs_trans_commit(tp);
> + if (ip) {
> + xfs_iunlock(ip, XFS_ILOCK_EXCL);
> + xfs_irele(ip);
> + }
> + return error;
> + }
Instead of coming up with our own inode unlocking and release schemes,
can't we just require that the inode is joinged by passing the lock
flags to xfs_trans_ijoin, and piggy back on xfs_trans_commit unlocking
it in that case?
next prev parent reply other threads:[~2020-10-02 7:30 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-29 17:43 [PATCH v3 0/3] xfs: fix inode use-after-free during log recovery Darrick J. Wong
2020-09-29 17:43 ` [PATCH 1/3] xfs: clean up bmap intent item recovery checking Darrick J. Wong
2020-09-29 17:44 ` [PATCH 2/3] xfs: clean up xfs_bui_item_recover iget/trans_alloc/ilock ordering Darrick J. Wong
2020-10-02 16:27 ` Brian Foster
2020-10-02 16:30 ` Darrick J. Wong
2020-10-04 19:09 ` [PATCH v3.2 " Darrick J. Wong
2020-10-05 16:19 ` Brian Foster
2020-09-29 17:44 ` [PATCH 3/3] xfs: fix an incore inode UAF in xfs_bui_recover Darrick J. Wong
2020-10-02 4:22 ` [PATCH v5.2 " Darrick J. Wong
2020-10-02 7:30 ` Christoph Hellwig [this message]
2020-10-02 16:29 ` Darrick J. Wong
2020-10-05 6:25 ` Christoph Hellwig
2020-10-04 19:11 ` [PATCH v3.3 " Darrick J. Wong
2020-10-05 16:20 ` Brian Foster
2020-10-05 17:01 ` 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=20201002073006.GE9900@lst.de \
--to=hch@lst.de \
--cc=bfoster@redhat.com \
--cc=darrick.wong@oracle.com \
--cc=david@fromorbit.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.