diff --git a/fs/ceph/snap.c b/fs/ceph/snap.c index 498ffc1a91cb..5c1540d95b8c 100644 --- a/fs/ceph/snap.c +++ b/fs/ceph/snap.c @@ -788,6 +788,7 @@ int ceph_update_snap_trace(struct ceph_mds_client *mdsc, struct ceph_snap_realm *first_realm = NULL; struct ceph_snap_realm *realm_to_rebuild = NULL; struct ceph_client *client = mdsc->fsc->client; + size_t snaps_len; int rebuild_snapcs; int err = -ENOMEM; int ret; @@ -802,8 +803,10 @@ int ceph_update_snap_trace(struct ceph_mds_client *mdsc, ceph_decode_need(&p, e, sizeof(*ri), bad); ri = p; p += sizeof(*ri); - ceph_decode_need(&p, e, sizeof(u64)*(le32_to_cpu(ri->num_snaps) + - le32_to_cpu(ri->num_prior_parent_snaps)), bad); + snaps_len = size_mul(size_add(le32_to_cpu(ri->num_snaps), + le32_to_cpu(ri->num_prior_parent_snaps)), + sizeof(u64)); + ceph_decode_need(&p, e, snaps_len, bad); snaps = p; p += sizeof(u64) * le32_to_cpu(ri->num_snaps); prior_parent_snaps = p;