]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
crypto: nx - Fix uninitialised hv_nxc on error
authorHerbert Xu <herbert@gondor.apana.org.au>
Sat, 15 Mar 2025 08:50:42 +0000 (16:50 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 10 Apr 2025 12:37:31 +0000 (14:37 +0200)
[ Upstream commit 9b00eb923f3e60ca76cbc8b31123716f3a87ac6a ]

The compiler correctly warns that hv_nxc may be used uninitialised
as that will occur when NX-GZIP is unavailable.

Fix it by rearranging the code and delay setting caps_feat until
the final query succeeds.

Fixes: b4ba22114c78 ("crypto/nx: Get NX capabilities for GZIP coprocessor type")
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/crypto/nx/nx-common-pseries.c

index 35f2d0d8507ed7747d362b9490789dae7c9c4144..7e98f174f69b9974b80785769aa9ab5e0fb172b3 100644 (file)
@@ -1144,6 +1144,7 @@ static void __init nxcop_get_capabilities(void)
 {
        struct hv_vas_all_caps *hv_caps;
        struct hv_nx_cop_caps *hv_nxc;
+       u64 feat;
        int rc;
 
        hv_caps = kmalloc(sizeof(*hv_caps), GFP_KERNEL);
@@ -1154,27 +1155,26 @@ static void __init nxcop_get_capabilities(void)
         */
        rc = h_query_vas_capabilities(H_QUERY_NX_CAPABILITIES, 0,
                                          (u64)virt_to_phys(hv_caps));
+       if (!rc)
+               feat = be64_to_cpu(hv_caps->feat_type);
+       kfree(hv_caps);
        if (rc)
-               goto out;
+               return;
+       if (!(feat & VAS_NX_GZIP_FEAT_BIT))
+               return;
 
-       caps_feat = be64_to_cpu(hv_caps->feat_type);
        /*
         * NX-GZIP feature available
         */
-       if (caps_feat & VAS_NX_GZIP_FEAT_BIT) {
-               hv_nxc = kmalloc(sizeof(*hv_nxc), GFP_KERNEL);
-               if (!hv_nxc)
-                       goto out;
-               /*
-                * Get capabilities for NX-GZIP feature
-                */
-               rc = h_query_vas_capabilities(H_QUERY_NX_CAPABILITIES,
-                                                 VAS_NX_GZIP_FEAT,
-                                                 (u64)virt_to_phys(hv_nxc));
-       } else {
-               pr_err("NX-GZIP feature is not available\n");
-               rc = -EINVAL;
-       }
+       hv_nxc = kmalloc(sizeof(*hv_nxc), GFP_KERNEL);
+       if (!hv_nxc)
+               return;
+       /*
+        * Get capabilities for NX-GZIP feature
+        */
+       rc = h_query_vas_capabilities(H_QUERY_NX_CAPABILITIES,
+                                         VAS_NX_GZIP_FEAT,
+                                         (u64)virt_to_phys(hv_nxc));
 
        if (!rc) {
                nx_cop_caps.descriptor = be64_to_cpu(hv_nxc->descriptor);
@@ -1184,13 +1184,10 @@ static void __init nxcop_get_capabilities(void)
                                be64_to_cpu(hv_nxc->min_compress_len);
                nx_cop_caps.min_decompress_len =
                                be64_to_cpu(hv_nxc->min_decompress_len);
-       } else {
-               caps_feat = 0;
+               caps_feat = feat;
        }
 
        kfree(hv_nxc);
-out:
-       kfree(hv_caps);
 }
 
 static const struct vio_device_id nx842_vio_driver_ids[] = {