Commit 9b00eb92 authored by Herbert Xu's avatar Herbert Xu
Browse files

crypto: nx - Fix uninitialised hv_nxc on error



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: b4ba2211 ("crypto/nx: Get NX capabilities for GZIP coprocessor type")
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 9cf79284
Loading
Loading
Loading
Loading
+17 −20
Original line number Diff line number Diff line
@@ -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;
		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));
	} else {
		pr_err("NX-GZIP feature is not available\n");
		rc = -EINVAL;
	}

	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[] = {