]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
powerpc/pseries: papr-phy-attest - validate cmd.length, plug mem leak
authorGeorge Wilson <gcwilson@linux.ibm.com>
Fri, 7 Aug 2026 16:56:21 +0000 (11:56 -0500)
committerMadhavan Srinivasan <maddy@linux.ibm.com>
Sat, 8 Aug 2026 05:02:26 +0000 (10:32 +0530)
In papr_phy_attest_create_handle(), the params->cmd.length is not
validated before use, which can result in a buffer overlow.  Check it and
return -EINVAL if it is either 0 or exceeds sizeof(params->cmd).

Also, params is freed on the success path but not error. Free it on
errors after memory allocation.  And free it on negative fd.

Fixes: 86900ab620a4 ("powerpc/pseries: Add a char driver for physical-attestation RTAS")
Acked-by: Haren Myneni <haren@linux.ibm.com>
Acked-by: Nayna Jain <nayna@linux.ibm.com>
Tested-by: R Nageswara Sastry <rnsastry@linux.ibm.com>
Cc: stable@vger.kernel.org # 6.16
Signed-off-by: George Wilson <gcwilson@linux.ibm.com>
Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com>
arch/powerpc/platforms/pseries/papr-phy-attest.c

index 20a0e1581302e8454cc7978ed1ce5e07d1034067..350ba26e5962780d6b9bb1f5f3ce928788323cae 100644 (file)
@@ -230,10 +230,17 @@ static long papr_phy_attest_create_handle(struct papr_phy_attest_io_block __user
                return -ENOMEM;
 
        if (copy_from_user(&params->cmd, ulc,
-                       sizeof(struct papr_phy_attest_io_block)))
+                       sizeof(struct papr_phy_attest_io_block))) {
+               kfree(params);
                return -EFAULT;
+       }
 
        params->cmd_len = be32_to_cpu(params->cmd.length);
+       if (params->cmd_len == 0 || params->cmd_len > sizeof(params->cmd)) {
+               kfree(params);
+               return -EINVAL;
+       }
+
        seq = (struct papr_rtas_sequence) {
                .begin = phy_attest_sequence_begin,
                .end = phy_attest_sequence_end,
@@ -246,6 +253,9 @@ static long papr_phy_attest_create_handle(struct papr_phy_attest_io_block __user
                        &papr_phy_attest_handle_ops,
                        "[papr-physical-attestation]");
 
+       if (fd < 0)
+               kfree(params);
+
        return fd;
 }