]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
s390/zcrypt: Pad trailing CCA or EP11 message with zeros
authorHarald Freudenberger <freude@linux.ibm.com>
Mon, 3 Aug 2026 08:33:38 +0000 (10:33 +0200)
committerVasily Gorbik <gor@linux.ibm.com>
Wed, 5 Aug 2026 13:12:22 +0000 (15:12 +0200)
The both functions xcrb_msg_to_type6cprb_msgx() and
xcrb_msg_to_type6_ep11cprb_msgx() copy the user space message into a
kernel buffer based on the message length. But on further processing
the message is supposed to be 4 byte length adjusted. Thus up to 3
bytes of uninitialized kernel memory are forwarded to further
processing steps and may unwanted expose kernel memory to the crypto
card firmware.

This patch contains code to pad the gap between user space copied
message and message buffer length sent down to further processing of
the CCA or EP11 message to zeros.

Fixes: e2c6d91eb8b1 ("s390/zcrypt: Rework domain processing within zcrypt device driver")
Signed-off-by: Harald Freudenberger <freude@linux.ibm.com>
Reviewed-by: Holger Dengler <dengler@linux.ibm.com>
Cc: stable@vger.kernel.org # 7.1+
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
drivers/s390/crypto/zcrypt_msgtype6.c

index e79e68b4dd41d08f43372a3c6e12c72aeefa8e5e..3df1d676de5d8e2369cf630b09117b28e07d097b 100644 (file)
@@ -398,6 +398,10 @@ static int xcrb_msg_to_type6cprb_msgx(bool userspace, struct ap_message *ap_msg,
                             xcrb->request_control_blk_addr,
                             xcrb->request_control_blk_length))
                return -EFAULT;
+       /* pad tail with 0 up to req_cblen */
+       if (xcrb->request_control_blk_length < req_cblen)
+               memset(msg->userdata + xcrb->request_control_blk_length,
+                      0, req_cblen - xcrb->request_control_blk_length);
        /* copy subfunction code into AP msg type 6 function code field */
        if (msg->cprbx.cprb_len > req_cblen - sizeof(msg->hdr.function_code))
                return -EINVAL;
@@ -542,6 +546,10 @@ static int xcrb_msg_to_type6_ep11cprb_msgx(bool userspace, struct ap_message *ap
        if (z_copy_from_user(userspace, msg->userdata,
                             (char __force __user *)xcrb->req, xcrb->req_len))
                return -EFAULT;
+       /* pad tail with 0 up to req_len */
+       if (xcrb->req_len < req_len)
+               memset(msg->userdata + xcrb->req_len, 0,
+                      req_len - xcrb->req_len);
 
        pld = msg->userdata + sizeof(struct ep11_cprb);
        pld_len = msg->cprbx.payload_len;