const char *name, u16 name_len,
                                          int mod);
 int verify_dir_item(struct btrfs_fs_info *fs_info,
-                   struct extent_buffer *leaf,
+                   struct extent_buffer *leaf, int slot,
                    struct btrfs_dir_item *dir_item);
 struct btrfs_dir_item *btrfs_match_dir_item_name(struct btrfs_fs_info *fs_info,
                                                 struct btrfs_path *path,
 
 
        leaf = path->nodes[0];
        dir_item = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_dir_item);
-       if (verify_dir_item(fs_info, leaf, dir_item))
+       if (verify_dir_item(fs_info, leaf, path->slots[0], dir_item))
                return NULL;
 
        total_len = btrfs_item_size_nr(leaf, path->slots[0]);
 
 int verify_dir_item(struct btrfs_fs_info *fs_info,
                    struct extent_buffer *leaf,
+                   int slot,
                    struct btrfs_dir_item *dir_item)
 {
        u16 namelen = BTRFS_NAME_LEN;
+       int ret;
        u8 type = btrfs_dir_type(leaf, dir_item);
 
        if (type >= BTRFS_FT_MAX) {
                return 1;
        }
 
+       namelen = btrfs_dir_name_len(leaf, dir_item);
+       ret = btrfs_is_name_len_valid(leaf, slot,
+                                     (unsigned long)(dir_item + 1), namelen);
+       if (!ret)
+               return 1;
+
        /* BTRFS_MAX_XATTR_SIZE is the same for all dir items */
        if ((btrfs_dir_data_len(leaf, dir_item) +
             btrfs_dir_name_len(leaf, dir_item)) >
 
                ctx->pos = found_key.offset;
 
                di = btrfs_item_ptr(leaf, slot, struct btrfs_dir_item);
-               if (verify_dir_item(fs_info, leaf, di))
+               if (verify_dir_item(fs_info, leaf, slot, di))
                        goto next;
 
                name_len = btrfs_dir_name_len(leaf, di);
 
        ptr_end = ptr + item_size;
        while (ptr < ptr_end) {
                di = (struct btrfs_dir_item *)ptr;
-               if (verify_dir_item(fs_info, eb, di))
+               if (verify_dir_item(fs_info, eb, slot, di))
                        return -EIO;
                name_len = btrfs_dir_name_len(eb, di);
                ret = replay_one_name(trans, root, path, eb, di, key);
        ptr_end = ptr + item_size;
        while (ptr < ptr_end) {
                di = (struct btrfs_dir_item *)ptr;
-               if (verify_dir_item(fs_info, eb, di)) {
+               if (verify_dir_item(fs_info, eb, slot, di)) {
                        ret = -EIO;
                        goto out;
                }
 
                        u32 this_len = sizeof(*di) + name_len + data_len;
                        unsigned long name_ptr = (unsigned long)(di + 1);
 
-                       if (verify_dir_item(fs_info, leaf, di)) {
+                       if (verify_dir_item(fs_info, leaf, slot, di)) {
                                ret = -EIO;
                                goto err;
                        }