vi->z_fragmentoff = map->m_plen;
                        if (recsz > offsetof(struct z_erofs_extent, pstart_lo))
                                vi->z_fragmentoff |= map->m_pa << 32;
-               } else if (map->m_plen) {
+               } else if (map->m_plen & Z_EROFS_EXTENT_PLEN_MASK) {
                        map->m_flags |= EROFS_MAP_MAPPED |
                                EROFS_MAP_FULL_MAPPED | EROFS_MAP_ENCODED;
                        fmt = map->m_plen >> Z_EROFS_EXTENT_PLEN_FMT_BIT;
                                    struct erofs_map_blocks *map)
 {
        struct erofs_sb_info *sbi = EROFS_I_SB(inode);
+       u64 pend;
 
        if (!(map->m_flags & EROFS_MAP_ENCODED))
                return 0;
        if (unlikely(map->m_plen > Z_EROFS_PCLUSTER_MAX_SIZE ||
                     map->m_llen > Z_EROFS_PCLUSTER_MAX_DSIZE))
                return -EOPNOTSUPP;
+       /* Filesystems beyond 48-bit physical block addresses are invalid */
+       if (unlikely(check_add_overflow(map->m_pa, map->m_plen, &pend) ||
+                    (pend >> sbi->blkszbits) >= BIT_ULL(48)))
+               return -EFSCORRUPTED;
        return 0;
 }