All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: Dave Chinner <david@fromorbit.com>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH 04/10] xfs: check directory bestfree information in the verifier
Date: Sun, 3 Jun 2018 21:23:05 -0700	[thread overview]
Message-ID: <20180604042305.GL7825@magnolia> (raw)
In-Reply-To: <20180604001019.GC10363@dastard>

On Mon, Jun 04, 2018 at 10:10:19AM +1000, Dave Chinner wrote:
> On Sun, Jun 03, 2018 at 04:22:49PM -0700, Darrick J. Wong wrote:
> > From: Darrick J. Wong <darrick.wong@oracle.com>
> > 
> > Create a variant of xfs_dir2_data_freefind that is suitable for use in a
> > verifier.  Because _freefind is called by the verifier, we simply
> > duplicate the _freefind function, convert the ASSERTs to return
> > __this_address, and modify the verifier to call our new function.  Once
> > we've made it impossible for directory blocks with bad bestfree data to
> > make it into the filesystem we can remove the DEBUG code from the
> > regular _freefind function.
> > 
> > Underlying argument: corruption of on-disk metadata should return
> > -EFSCORRUPTED instead of blowing ASSERTs.
> > 
> > Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> > ---
> >  fs/xfs/libxfs/xfs_dir2_data.c |  121 +++++++++++++++++++++++++++++------------
> >  1 file changed, 86 insertions(+), 35 deletions(-)
> > 
> > 
> > diff --git a/fs/xfs/libxfs/xfs_dir2_data.c b/fs/xfs/libxfs/xfs_dir2_data.c
> > index cb67ec730b9b..bc5c0ba46ec6 100644
> > --- a/fs/xfs/libxfs/xfs_dir2_data.c
> > +++ b/fs/xfs/libxfs/xfs_dir2_data.c
> > @@ -33,6 +33,11 @@
> >  #include "xfs_cksum.h"
> >  #include "xfs_log.h"
> >  
> > +static xfs_failaddr_t xfs_dir2_data_freefind_verify(
> > +		struct xfs_dir2_data_hdr *hdr, struct xfs_dir2_data_free *bf,
> > +		struct xfs_dir2_data_unused *dup,
> > +		struct xfs_dir2_data_free **bf_ent);
> > +
> >  /*
> >   * Check the consistency of the data block.
> >   * The input can also be a block-format directory.
> > @@ -52,6 +57,7 @@ __xfs_dir3_data_check(
> >  	xfs_dir2_data_free_t	*dfp;		/* bestfree entry */
> >  	xfs_dir2_data_unused_t	*dup;		/* unused entry */
> >  	char			*endp;		/* end of useful data */
> > +	xfs_failaddr_t		fa;
> >  	int			freeseen;	/* mask of bestfrees seen */
> >  	xfs_dahash_t		hash;		/* hash of current name */
> >  	int			i;		/* leaf index */
> 
> This could be placed inside the loop scope, right?

Right.

> > -	ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) ||
> > -	       hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) ||
> > -	       hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) ||
> > -	       hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC));
> > -	for (dfp = &bf[0], seenzero = matched = 0;
> > -	     dfp < &bf[XFS_DIR2_DATA_FD_COUNT];
> > -	     dfp++) {
> > +	for (dfp = &bf[0]; dfp < &bf[XFS_DIR2_DATA_FD_COUNT]; dfp++) {
> >  		if (!dfp->offset) {
> > -			ASSERT(!dfp->length);
> > -			seenzero = 1;
> > +			if (dfp->length)
> > +				return __this_address;
> > +			seenzero = true;
> >  			continue;
> >  		}
> > -		ASSERT(seenzero == 0);
> > +		if (seenzero)
> > +			return __this_address;
> >  		if (be16_to_cpu(dfp->offset) == off) {
> > -			matched = 1;
> > -			ASSERT(dfp->length == dup->length);
> > -		} else if (off < be16_to_cpu(dfp->offset))
> > -			ASSERT(off + be16_to_cpu(dup->length) <= be16_to_cpu(dfp->offset));
> > -		else
> > -			ASSERT(be16_to_cpu(dfp->offset) + be16_to_cpu(dfp->length) <= off);
> > -		ASSERT(matched || be16_to_cpu(dfp->length) >= be16_to_cpu(dup->length));
> > -		if (dfp > &bf[0])
> > -			ASSERT(be16_to_cpu(dfp[-1].length) >= be16_to_cpu(dfp[0].length));
> > +			matched = true;
> > +			if (dfp->length != dup->length)
> > +				return __this_address;
> > +		} else if (be16_to_cpu(dfp->offset) > off) {
> > +			if (off + be16_to_cpu(dup->length) >
> > +			    be16_to_cpu(dfp->offset))
> 
> can you indent the second line further to indicate it is a
> continuation of the logic statement on the previous line rather than
> a new logic condition? i.e.

Ok.

> 			if (off + be16_to_cpu(dup->length) >
> 					be16_to_cpu(dfp->offset))
> > +				return __this_address;
> > +		} else {
> > +			if (be16_to_cpu(dfp->offset) +
> > +			    be16_to_cpu(dfp->length) > off)
> > +				return __this_address;
> 
> Same here?

Fixed.

> > +		}
> > +		if (!matched &&
> > +		    be16_to_cpu(dfp->length) < be16_to_cpu(dup->length))
> > +			return __this_address;
> > +		if (dfp > &bf[0] &&
> > +		    be16_to_cpu(dfp[-1].length) < be16_to_cpu(dfp[0].length))
> > +			return __this_address;
> >  	}
> > -#endif
> > +
> > +	/*
> > +	 * If this is smaller than the smallest bestfree entry,
> > +	 * it can't be there since they're sorted.
> > +	 */
> > +	if (be16_to_cpu(dup->length) <
> > +	    be16_to_cpu(bf[XFS_DIR2_DATA_FD_COUNT - 1].length))
> > +		return NULL;
> > +	/*
> > +	 * Look at the three bestfree entries for our guy.
> > +	 */
> > +	for (dfp = &bf[0]; dfp < &bf[XFS_DIR2_DATA_FD_COUNT]; dfp++) {
> > +		if (!dfp->offset)
> > +			return NULL;
> > +		if (be16_to_cpu(dfp->offset) == off) {
> > +			*bf_ent = dfp;
> > +			return NULL;
> > +		}
> > +	}
> > +	/*
> > +	 * Didn't find it.  This only happens if there are duplicate lengths.
> > +	 */
> > +	return NULL;
> 
> And this tail is basically a duplicate of what now remains in
> xfs_dir2_data_freefind(). Can you call that function rather than
> duplicating the search code?

Will do.

--D

> Cheers,
> 
> Dave.
> -- 
> Dave Chinner
> david@fromorbit.com
> --
> 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

  reply	other threads:[~2018-06-04  4:23 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-06-03 23:22 [PATCH 00/10] xfs: fix various checking problems Darrick J. Wong
2018-06-03 23:22 ` [PATCH 01/10] xfs: don't forbid setting dax flag on directories if device doesn't dax Darrick J. Wong
2018-06-03 23:41   ` Dave Chinner
2018-06-04  4:25     ` Darrick J. Wong
2018-06-03 23:22 ` [PATCH 02/10] xfs: strengthen btree pointer checks before use Darrick J. Wong
2018-06-03 23:45   ` Dave Chinner
2018-06-03 23:22 ` [PATCH 03/10] xfs: don't assert when on-disk btree pointers are garbage Darrick J. Wong
2018-06-03 23:49   ` Dave Chinner
2018-06-03 23:55     ` Dave Chinner
2018-06-03 23:22 ` [PATCH 04/10] xfs: check directory bestfree information in the verifier Darrick J. Wong
2018-06-04  0:10   ` Dave Chinner
2018-06-04  4:23     ` Darrick J. Wong [this message]
2018-06-03 23:22 ` [PATCH 05/10] xfs: don't assert when reporting on-disk corruption while loading btree Darrick J. Wong
2018-06-03 23:51   ` Dave Chinner
2018-06-03 23:23 ` [PATCH 06/10] xfs: remove redundant ASSERT on insufficient bestfree length in _leaf_addname Darrick J. Wong
2018-06-04  0:11   ` Dave Chinner
2018-06-03 23:23 ` [PATCH 07/10] xfs: xfs_alloc_get_rec should return EFSCORRUPTED for obvious bnobt corruption Darrick J. Wong
2018-06-04  0:14   ` Dave Chinner
2018-06-04  4:32     ` Darrick J. Wong
2018-06-04 23:22       ` Dave Chinner
2018-06-03 23:23 ` [PATCH 08/10] xfs: btree lookup shouldn't ASSERT on empty btree nodes Darrick J. Wong
2018-06-04  0:14   ` Dave Chinner
2018-06-03 23:23 ` [PATCH 09/10] xfs: don't ASSERT on short form btree root pointer of zero Darrick J. Wong
2018-06-04  0:15   ` Dave Chinner
2018-06-03 23:23 ` [PATCH 10/10] xfs: don't return garbage buffers in xfs_da3_node_read Darrick J. Wong
2018-06-04  0:18   ` Dave Chinner

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=20180604042305.GL7825@magnolia \
    --to=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.