On Tue, Dec 19, 2017 at 04:27:58PM +1100, Dave Chinner wrote: > On Wed, Dec 13, 2017 at 03:59:01PM -0800, Darrick J. Wong wrote: > > From: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > > > > Create a function to check the structure of short form symlink targets. > > > > Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > > --- > > fs/xfs/libxfs/xfs_shared.h | 1 + > > fs/xfs/libxfs/xfs_symlink_remote.c | 36 ++++++++++++++++++++++++++++++++++++ > > 2 files changed, 37 insertions(+) > > > > > > diff --git a/fs/xfs/libxfs/xfs_shared.h b/fs/xfs/libxfs/xfs_shared.h > > index c6f4eb4..67ccb1a 100644 > > --- a/fs/xfs/libxfs/xfs_shared.h > > +++ b/fs/xfs/libxfs/xfs_shared.h > > @@ -143,5 +143,6 @@ bool xfs_symlink_hdr_ok(xfs_ino_t ino, uint32_t offset, > > uint32_t size, struct xfs_buf *bp); > > void xfs_symlink_local_to_remote(struct xfs_trans *tp, struct xfs_buf *bp, > > struct xfs_inode *ip, struct xfs_ifork *ifp); > > +xfs_failaddr_t xfs_symlink_shortform_verify(struct xfs_inode *ip); > > > > #endif /* __XFS_SHARED_H__ */ > > diff --git a/fs/xfs/libxfs/xfs_symlink_remote.c b/fs/xfs/libxfs/xfs_symlink_remote.c > > index b6ef6cb..5d9642e 100644 > > --- a/fs/xfs/libxfs/xfs_symlink_remote.c > > +++ b/fs/xfs/libxfs/xfs_symlink_remote.c > > @@ -210,3 +210,39 @@ xfs_symlink_local_to_remote( > > xfs_trans_log_buf(tp, bp, 0, sizeof(struct xfs_dsymlink_hdr) + > > ifp->if_bytes - 1); > > } > > + > > +/* Verify the consistency of an inline symlink. */ > > +xfs_failaddr_t > > +xfs_symlink_shortform_verify( > > + struct xfs_inode *ip) > > +{ > > + char *sfp; > > + char *endp; > > + struct xfs_ifork *ifp; > > + int size; > > + > > + ASSERT(ip->i_d.di_format == XFS_DINODE_FMT_LOCAL); > > + ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); > > + sfp = (char *)ifp->if_u1.if_data; > > + size = ifp->if_bytes; > > + endp = sfp + size; > > + > > + /* Zero length symlinks can exist while we're deleting a remote one. */ > > + if (size == 0) > > + return NULL; > > + > > + /* No negative sizes or overly long symlink targets. */ > > + if (size < 0 || size > XFS_SYMLINK_MAXLEN) > > + return __this_address; > > + > > + /* No NULLs in the target either. */ > > + for (; sfp < endp; sfp++) { > > + if (*sfp == 0) > > + return __this_address; > > + } > > if (memchr(sfp, 0, size - 1)) > return __this_address; Fixed. --D > Otherwise looks ok. > > Reviewed-by: Dave Chinner <dchinner@xxxxxxxxxx> > > -- > Dave Chinner > david@xxxxxxxxxxxxx > -- > To unsubscribe from this list: send the line "unsubscribe linux-xfs" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > 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@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html