[PATCH v2 1/2] s390/sclp_ocf: Fix computation of length of GDS values
Alexander Egorenkov <[email protected]>
| Newsgroups | org.kernel.vger.linux-s390 |
|---|---|
| Message-ID | <[email protected]> |
There is a potential invalid read memory access while extracting the HMC network and the CPC name from event buffers sent by OCF. Both, the HMC network and the CPC name, are sent as a GDS subvector. A value stored in the length field of the header of a GDS (sub)vector includes not only the size of a GDS value but also the size of the GDS header. Therefore, to obtain the size of the GDS value only, the size of the GDS header must be first subtracted from the total GDS (sub)vector length. If the length of the HMC network or the CPC name is less than 6, then the total length of the GDS subvector carrying it will be less than 8 (length of value plus 2 bytes for GDS subvector header). In that case the memcpy() call in sclp_ocf_handler() will read extra 2 bytes following the GDS subvector. Signed-off-by: Alexander Egorenkov <[email protected]> --- drivers/s390/char/sclp_ocf.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/s390/char/sclp_ocf.c b/drivers/s390/char/sclp_ocf.c index 35f3a4a08b12..cee4bfa4a48a 100644 --- a/drivers/s390/char/sclp_ocf.c +++ b/drivers/s390/char/sclp_ocf.c @@ -66,13 +66,13 @@ static void sclp_ocf_handler(struct evbuf_header *evbuf) /* Copy network name and cpc name. */ spin_lock(&sclp_ocf_lock); if (netid) { - size = min(OCF_LENGTH_HMC_NETWORK, (size_t) netid->length); + size = min(OCF_LENGTH_HMC_NETWORK, (size_t) netid->length - sizeof(*netid)); memcpy(hmc_network, netid + 1, size); EBCASC(hmc_network, size); hmc_network[size] = 0; } if (cpc) { - size = min(OCF_LENGTH_CPC_NAME, (size_t) cpc->length); + size = min(OCF_LENGTH_CPC_NAME, (size_t) cpc->length - sizeof(*cpc)); memset(cpc_name, 0, OCF_LENGTH_CPC_NAME); memcpy(cpc_name, cpc + 1, size); } -- 2.53.0