A bad on-disk tree depth in traverse_int_dir2block() can
later cause a segfault when it's used as an array index in
this function; if we get something beyond the max depth,
just error out and the dir will get rebuilt.
Reported-by: Richard Kolkovich <richard@intrameta.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
Reviewed-by: Christoph Hellwig <hch@lst.de>
/*
* maintain level counter
*/
- if (i == -1)
+ if (i == -1) {
i = da_cursor->active = be16_to_cpu(node->hdr.level);
- else {
+ if (i >= XFS_DA_NODE_MAXDEPTH) {
+ do_warn(_("bad header depth for directory "
+ "inode %llu\n"),
+ da_cursor->ino);
+ da_brelse(bp);
+ i = -1;
+ goto error_out;
+ }
+ } else {
if (be16_to_cpu(node->hdr.level) == i - 1) {
i--;
} else {