]> git.ipfire.org Git - thirdparty/linux.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)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 21 Mar 2025 09:33:39 +0000 (17:33 +0800)
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>
drivers/crypto/nx/nx-common-pseries.c

index 1660c5cf3641c20642aff76fcd7e3ebc12d5462a..56129bdf53ab03cbbefa8f2042b7b53388404dcd 100644 (file)
@@ -1145,6 +1145,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);
@@ -1155,27 +1156,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);
@@ -1185,13 +1185,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[] = {