diff --git a/fs/ceph/mdsmap.c b/fs/ceph/mdsmap.c index 53079ef34c3a..5e3b8c3ca502 100644 --- a/fs/ceph/mdsmap.c +++ b/fs/ceph/mdsmap.c @@ -170,6 +170,10 @@ struct ceph_mdsmap *ceph_mdsmap_decode(struct ceph_mds_client *mdsc, void **p, * and the mds rank >= m_num_active_mds. */ m->possible_max_rank = max(m->m_num_active_mds, m->m_max_mds); + if (m->possible_max_rank > CEPH_MAX_MDS) { + err = -EIO; + goto corrupt; + } m->m_info = kzalloc_objs(*m->m_info, m->possible_max_rank, GFP_NOFS); if (!m->m_info) @@ -316,6 +320,10 @@ struct ceph_mdsmap *ceph_mdsmap_decode(struct ceph_mds_client *mdsc, void **p, { int num_laggy = 0; ceph_decode_32_safe(p, end, n, bad_ext); + if (n > CEPH_MAX_MDS) { + err = -EIO; + goto corrupt; + } ceph_decode_need(p, end, sizeof(u32) * n, bad_ext); for (i = 0; i < n; i++) {