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

Commit 2959762b authored by Aditya Bavanari's avatar Aditya Bavanari
Browse files

ASoC: msm: qdsp6v2: Set freed pointers to NULL



Set freed pointers to NULL to avoid double free
in msm_compr_playback_open and msm_compr_playback_free
functions of compress driver.

CRs-Fixed: 2142216
Change-Id: Ifd011dd85dd9f610c7b69dd460f73d26e006cd66
Signed-off-by: default avatarAditya Bavanari <abavanar@codeaurora.org>
parent 501a8de7
Loading
Loading
Loading
Loading
+18 −3
Original line number Diff line number Diff line
@@ -105,6 +105,7 @@ struct msm_compr_pdata {
	struct msm_compr_dec_params *dec_params[MSM_FRONTEND_DAI_MAX];
	struct msm_compr_ch_map *ch_map[MSM_FRONTEND_DAI_MAX];
	int32_t ion_fd[MSM_FRONTEND_DAI_MAX];
	bool is_in_use[MSM_FRONTEND_DAI_MAX];
};

struct msm_compr_audio {
@@ -1574,12 +1575,17 @@ static int msm_compr_playback_open(struct snd_compr_stream *cstream)
{
	struct snd_compr_runtime *runtime = cstream->runtime;
	struct snd_soc_pcm_runtime *rtd = cstream->private_data;
	struct msm_compr_audio *prtd;
	struct msm_compr_audio *prtd = NULL;
	struct msm_compr_pdata *pdata =
			snd_soc_platform_get_drvdata(rtd->platform);
	int ret = 0;

	pr_debug("%s\n", __func__);
	if (pdata->is_in_use[rtd->dai_link->be_id] == true) {
		pr_err("%s: %s is already in use,err: %d ",
			__func__, rtd->dai_link->cpu_dai_name, -EBUSY);
		return -EBUSY;
	}
	prtd = kzalloc(sizeof(struct msm_compr_audio), GFP_KERNEL);
	if (prtd == NULL) {
		pr_err("Failed to allocate memory for msm_compr_audio\n");
@@ -1591,14 +1597,14 @@ static int msm_compr_playback_open(struct snd_compr_stream *cstream)
	pdata->cstream[rtd->dai_link->be_id] = cstream;
	pdata->audio_effects[rtd->dai_link->be_id] =
		 kzalloc(sizeof(struct msm_compr_audio_effects), GFP_KERNEL);
	if (!pdata->audio_effects[rtd->dai_link->be_id]) {
	if (pdata->audio_effects[rtd->dai_link->be_id] == NULL) {
		pr_err("%s: Could not allocate memory for effects\n", __func__);
		ret = -ENOMEM;
		goto effect_err;
	}
	pdata->dec_params[rtd->dai_link->be_id] =
		 kzalloc(sizeof(struct msm_compr_dec_params), GFP_KERNEL);
	if (!pdata->dec_params[rtd->dai_link->be_id]) {
	if (pdata->dec_params[rtd->dai_link->be_id] == NULL) {
		pr_err("%s: Could not allocate memory for dec params\n",
			__func__);
		ret = -ENOMEM;
@@ -1659,14 +1665,17 @@ static int msm_compr_playback_open(struct snd_compr_stream *cstream)
		if (ret < 0)
			goto map_err;
	}
	pdata->is_in_use[rtd->dai_link->be_id] = true;
	return 0;

map_err:
	q6asm_audio_client_free(prtd->audio_client);
ac_err:
	kfree(pdata->dec_params[rtd->dai_link->be_id]);
	pdata->dec_params[rtd->dai_link->be_id] = NULL;
param_err:
	kfree(pdata->audio_effects[rtd->dai_link->be_id]);
	pdata->audio_effects[rtd->dai_link->be_id] = NULL;
effect_err:
	pdata->cstream[rtd->dai_link->be_id] = NULL;
	runtime->private_data = NULL;
@@ -1836,10 +1845,15 @@ static int msm_compr_playback_free(struct snd_compr_stream *cstream)

	q6asm_audio_client_free(ac);
	msm_adsp_clean_mixer_ctl_pp_event_queue(soc_prtd);
	if (pdata->audio_effects[soc_prtd->dai_link->be_id] != NULL) {
	kfree(pdata->audio_effects[soc_prtd->dai_link->be_id]);
	pdata->audio_effects[soc_prtd->dai_link->be_id] = NULL;
	}
	if (pdata->dec_params[soc_prtd->dai_link->be_id] != NULL) {
	kfree(pdata->dec_params[soc_prtd->dai_link->be_id]);
	pdata->dec_params[soc_prtd->dai_link->be_id] = NULL;
	}
	pdata->is_in_use[soc_prtd->dai_link->be_id] = false;
	kfree(prtd);
	runtime->private_data = NULL;

@@ -4038,6 +4052,7 @@ static int msm_compr_probe(struct snd_soc_platform *platform)
		pdata->dec_params[i] = NULL;
		pdata->cstream[i] = NULL;
		pdata->ch_map[i] = NULL;
		pdata->is_in_use[i] = false;
	}

	snd_soc_add_platform_controls(platform, msm_compr_gapless_controls,