Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aba964d7 authored by Dipen Parmar's avatar Dipen Parmar
Browse files

msm: sps: Fix error case handling in probe function



Fix possible NULL pointer dereference in the probe
function by adding proper error case handling for
clk errors.

CRs-fixed: 583991
Change-Id: Ief54cc28487e5559a893fa2f4c57148e76bd1acb
Signed-off-by: default avatarDipen Parmar <dipenp@codeaurora.org>
parent cd45ce66
Loading
Loading
Loading
Loading
+17 −11
Original line number Original line Diff line number Diff line
@@ -2535,13 +2535,12 @@ static int msm_sps_probe(struct platform_device *pdev)
			ret = -EPROBE_DEFER;
			ret = -EPROBE_DEFER;
		else
		else
			SPS_ERR("sps:fail to get dfab_clk.");
			SPS_ERR("sps:fail to get dfab_clk.");
		goto clk_err;
		goto dfab_clk_err;
	} else {
	} else {
		ret = clk_set_rate(sps->dfab_clk, 64000000);
		ret = clk_set_rate(sps->dfab_clk, 64000000);
		if (ret) {
		if (ret) {
			SPS_ERR("sps:failed to set dfab_clk rate.");
			SPS_ERR("sps:failed to set dfab_clk rate.");
			clk_put(sps->dfab_clk);
			goto dfab_clk_set_err;
			goto clk_err;
		}
		}
	}
	}


@@ -2552,12 +2551,12 @@ static int msm_sps_probe(struct platform_device *pdev)
				ret = -EPROBE_DEFER;
				ret = -EPROBE_DEFER;
			else
			else
				SPS_ERR("sps:fail to get pmem_clk.");
				SPS_ERR("sps:fail to get pmem_clk.");
			goto clk_err;
			goto dfab_clk_set_err;
		} else {
		} else {
			ret = clk_prepare_enable(sps->pmem_clk);
			ret = clk_prepare_enable(sps->pmem_clk);
			if (ret) {
			if (ret) {
				SPS_ERR("sps:failed to enable pmem_clk.");
				SPS_ERR("sps:failed to enable pmem_clk.");
				goto clk_err;
				goto pmem_clk_set_err;
			}
			}
		}
		}
	}
	}
@@ -2569,19 +2568,21 @@ static int msm_sps_probe(struct platform_device *pdev)
			ret = -EPROBE_DEFER;
			ret = -EPROBE_DEFER;
		else
		else
			SPS_ERR("sps:fail to get bamdma_clk.");
			SPS_ERR("sps:fail to get bamdma_clk.");
		goto clk_err;
		goto pmem_clk_set_err;
	} else {
	} else {
		ret = clk_prepare_enable(sps->bamdma_clk);
		ret = clk_prepare_enable(sps->bamdma_clk);
		if (ret) {
		if (ret) {
			SPS_ERR("sps:failed to enable bamdma_clk. ret=%d", ret);
			SPS_ERR("sps:failed to enable bamdma_clk. ret=%d", ret);
			goto clk_err;
			clk_put(sps->bamdma_clk);
			goto pmem_clk_set_err;
		}
		}
	}
	}


	ret = clk_prepare_enable(sps->dfab_clk);
	ret = clk_prepare_enable(sps->dfab_clk);
	if (ret) {
	if (ret) {
		SPS_ERR("sps:failed to enable dfab_clk. ret=%d", ret);
		SPS_ERR("sps:failed to enable dfab_clk. ret=%d", ret);
		goto clk_err;
		clk_put(sps->bamdma_clk);
		goto pmem_clk_set_err;
	}
	}
#endif
#endif
	ret = sps_device_init();
	ret = sps_device_init();
@@ -2590,8 +2591,9 @@ static int msm_sps_probe(struct platform_device *pdev)
#ifdef CONFIG_SPS_SUPPORT_BAMDMA
#ifdef CONFIG_SPS_SUPPORT_BAMDMA
		clk_disable_unprepare(sps->dfab_clk);
		clk_disable_unprepare(sps->dfab_clk);
		clk_disable_unprepare(sps->bamdma_clk);
		clk_disable_unprepare(sps->bamdma_clk);
		clk_put(sps->bamdma_clk);
#endif
#endif
		goto sps_device_init_err;
		goto pmem_clk_set_err;
	}
	}
#ifdef CONFIG_SPS_SUPPORT_BAMDMA
#ifdef CONFIG_SPS_SUPPORT_BAMDMA
	clk_disable_unprepare(sps->dfab_clk);
	clk_disable_unprepare(sps->dfab_clk);
@@ -2602,8 +2604,12 @@ static int msm_sps_probe(struct platform_device *pdev)
	SPS_INFO("sps:sps is ready.");
	SPS_INFO("sps:sps is ready.");


	return 0;
	return 0;
clk_err:
pmem_clk_set_err:
sps_device_init_err:
	if (!d_type)
		clk_put(sps->pmem_clk);
dfab_clk_set_err:
	clk_put(sps->dfab_clk);
dfab_clk_err:
	device_destroy(sps->dev_class, sps->dev_num);
	device_destroy(sps->dev_class, sps->dev_num);
device_create_err:
device_create_err:
	unregister_chrdev_region(sps->dev_num, 1);
	unregister_chrdev_region(sps->dev_num, 1);