Print this page
6842 Fix empty xattr dir causing lockup
Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed by: Dan McDonald <danmcd@omniti.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/zfs/zap.c
          +++ new/usr/src/uts/common/fs/zfs/zap.c
↓ open down ↓ 567 lines elided ↑ open up ↑
 568  568  }
 569  569  
 570  570  static int
 571  571  zap_deref_leaf(zap_t *zap, uint64_t h, dmu_tx_t *tx, krw_t lt, zap_leaf_t **lp)
 572  572  {
 573  573          uint64_t idx, blk;
 574  574          int err;
 575  575  
 576  576          ASSERT(zap->zap_dbuf == NULL ||
 577  577              zap_f_phys(zap) == zap->zap_dbuf->db_data);
 578      -        ASSERT3U(zap_f_phys(zap)->zap_magic, ==, ZAP_MAGIC);
      578 +
      579 +        /* Reality check for corrupt zap objects (leaf or header). */
      580 +        if ((zap_f_phys(zap)->zap_block_type != ZBT_LEAF &&
      581 +            zap_f_phys(zap)->zap_block_type != ZBT_HEADER) ||
      582 +            zap_f_phys(zap)->zap_magic != ZAP_MAGIC) {
      583 +                return (SET_ERROR(EIO));
      584 +        }
      585 +
 579  586          idx = ZAP_HASH_IDX(h, zap_f_phys(zap)->zap_ptrtbl.zt_shift);
 580  587          err = zap_idx_to_blk(zap, idx, &blk);
 581  588          if (err != 0)
 582  589                  return (err);
 583  590          err = zap_get_leaf_byblk(zap, blk, tx, lt, lp);
 584  591  
 585  592          ASSERT(err ||
 586  593              ZAP_HASH_IDX(h, zap_leaf_phys(*lp)->l_hdr.lh_prefix_len) ==
 587  594              zap_leaf_phys(*lp)->l_hdr.lh_prefix);
 588  595          return (err);
↓ open down ↓ 777 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX