xfs: check that dir block entries don't off the end of the buffer
When we're checking the entries in a directory buffer, make sure that the entry length doesn't push us off the end of the buffer. Found via xfs/388 writing ones to the length fields. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Brian Foster <bfoster@redhat.com>
This commit is contained in:
parent
cfaf2d0343
commit
6215894e11
|
@ -136,6 +136,8 @@ __xfs_dir3_data_check(
|
||||||
*/
|
*/
|
||||||
if (be16_to_cpu(dup->freetag) == XFS_DIR2_DATA_FREE_TAG) {
|
if (be16_to_cpu(dup->freetag) == XFS_DIR2_DATA_FREE_TAG) {
|
||||||
XFS_WANT_CORRUPTED_RETURN(mp, lastfree == 0);
|
XFS_WANT_CORRUPTED_RETURN(mp, lastfree == 0);
|
||||||
|
XFS_WANT_CORRUPTED_RETURN(mp, endp >=
|
||||||
|
p + be16_to_cpu(dup->length));
|
||||||
XFS_WANT_CORRUPTED_RETURN(mp,
|
XFS_WANT_CORRUPTED_RETURN(mp,
|
||||||
be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup)) ==
|
be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup)) ==
|
||||||
(char *)dup - (char *)hdr);
|
(char *)dup - (char *)hdr);
|
||||||
|
@ -164,6 +166,8 @@ __xfs_dir3_data_check(
|
||||||
XFS_WANT_CORRUPTED_RETURN(mp, dep->namelen != 0);
|
XFS_WANT_CORRUPTED_RETURN(mp, dep->namelen != 0);
|
||||||
XFS_WANT_CORRUPTED_RETURN(mp,
|
XFS_WANT_CORRUPTED_RETURN(mp,
|
||||||
!xfs_dir_ino_validate(mp, be64_to_cpu(dep->inumber)));
|
!xfs_dir_ino_validate(mp, be64_to_cpu(dep->inumber)));
|
||||||
|
XFS_WANT_CORRUPTED_RETURN(mp, endp >=
|
||||||
|
p + ops->data_entsize(dep->namelen));
|
||||||
XFS_WANT_CORRUPTED_RETURN(mp,
|
XFS_WANT_CORRUPTED_RETURN(mp,
|
||||||
be16_to_cpu(*ops->data_entry_tag_p(dep)) ==
|
be16_to_cpu(*ops->data_entry_tag_p(dep)) ==
|
||||||
(char *)dep - (char *)hdr);
|
(char *)dep - (char *)hdr);
|
||||||
|
|
Loading…
Reference in New Issue