goto not_found;
 
        smc_v2_ext = smc_get_clc_v2_ext(pclc);
-       if (!smc_clc_match_eid(ini->negotiated_eid, smc_v2_ext, NULL, NULL))
+       if (!smc_v2_ext ||
+           !smc_clc_match_eid(ini->negotiated_eid, smc_v2_ext, NULL, NULL))
                goto not_found;
 
        /* prepare RDMA check */
 
        struct smc_clc_msg_hdr *hdr = &pclc->hdr;
        struct smc_clc_v2_extension *v2_ext;
 
-       v2_ext = smc_get_clc_v2_ext(pclc);
        pclc_prfx = smc_clc_proposal_get_prefix(pclc);
        if (!pclc_prfx ||
            pclc_prfx->ipv6_prefixes_cnt > SMC_CLC_MAX_V6_PREFIX)
                        sizeof(struct smc_clc_msg_trail))
                        return false;
        } else {
+               v2_ext = smc_get_clc_v2_ext(pclc);
+               if ((hdr->typev2 != SMC_TYPE_N &&
+                    (!v2_ext || v2_ext->hdr.eid_cnt > SMC_CLC_MAX_UEID)) ||
+                   (smcd_indicated(hdr->typev2) &&
+                    v2_ext->hdr.ism_gid_cnt > SMCD_CLC_MAX_V2_GID_ENTRIES))
+                       return false;
+
                if (ntohs(hdr->length) !=
                        sizeof(*pclc) +
                        sizeof(struct smc_clc_msg_smcd) +
 
 smc_get_clc_v2_ext(struct smc_clc_msg_proposal *prop)
 {
        struct smc_clc_msg_smcd *prop_smcd = smc_get_clc_msg_smcd(prop);
+       u16 max_offset;
 
-       if (!prop_smcd || !ntohs(prop_smcd->v2_ext_offset))
+       max_offset = offsetof(struct smc_clc_msg_proposal_area, pclc_v2_ext) -
+                    offsetof(struct smc_clc_msg_proposal_area, pclc_smcd) -
+                    offsetofend(struct smc_clc_msg_smcd, v2_ext_offset);
+
+       if (!prop_smcd || !ntohs(prop_smcd->v2_ext_offset) ||
+           ntohs(prop_smcd->v2_ext_offset) > max_offset)
                return NULL;
 
        return (struct smc_clc_v2_extension *)