Message ID | 1dd0f08c152af476e3a5af48ce7de97cd759616a.1461831763.git.mengdong.lin@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Dne 28.4.2016 v 10:41 mengdong.lin@linux.intel.com napsal(a): > priv_data_size = ref->data->size; > + elem->obj = realloc(elem->obj, > + elem->size + priv_data_size); > + if (!elem->obj) > + return -ENOMEM; This causes a memory leak when realloc fails. You should free the original pointer when realloc() fails. Jaroslav
On Thu, 28 Apr 2016 10:48:36 +0200, Jaroslav Kysela wrote: > > Dne 28.4.2016 v 10:41 mengdong.lin@linux.intel.com napsal(a): > > priv_data_size = ref->data->size; > > + elem->obj = realloc(elem->obj, > > + elem->size + priv_data_size); > > + if (!elem->obj) > > + return -ENOMEM; > > This causes a memory leak when realloc fails. You should free the > original pointer when realloc() fails. Right, and the bug (the leak) has been already present before the patch... thanks, Takashi
> -----Original Message----- > From: Takashi Iwai [mailto:tiwai@suse.de] > Sent: Thursday, April 28, 2016 9:55 PM > To: Jaroslav Kysela > Cc: mengdong.lin@linux.intel.com; alsa-devel@alsa-project.org; > broonie@kernel.org; Girdwood, Liam R; Lin, Mengdong; Shah, Hardik T; Singh, > Guneshwor O > Subject: Re: [PATCH 3/6] topology: Use generic pointer to realloc buffer for > private data > > On Thu, 28 Apr 2016 10:48:36 +0200, > Jaroslav Kysela wrote: > > > > Dne 28.4.2016 v 10:41 mengdong.lin@linux.intel.com napsal(a): > > > priv_data_size = ref->data->size; > > > + elem->obj = realloc(elem->obj, > > > + elem->size + priv_data_size); > > > + if (!elem->obj) > > > + return -ENOMEM; > > > > This causes a memory leak when realloc fails. You should free the > > original pointer when realloc() fails. > > Right, and the bug (the leak) has been already present before the patch... > Okay, we'll fix this. Thanks for pointing out this. Regards Mengdong
On 04/28/2016 10:30 PM, Lin, Mengdong wrote: >> -----Original Message----- >> From: Takashi Iwai [mailto:tiwai@suse.de] >> Sent: Thursday, April 28, 2016 9:55 PM >> To: Jaroslav Kysela >> Cc: mengdong.lin@linux.intel.com; alsa-devel@alsa-project.org; >> broonie@kernel.org; Girdwood, Liam R; Lin, Mengdong; Shah, Hardik T; Singh, >> Guneshwor O >> Subject: Re: [PATCH 3/6] topology: Use generic pointer to realloc buffer for >> private data >> >> On Thu, 28 Apr 2016 10:48:36 +0200, >> Jaroslav Kysela wrote: >>> >>> Dne 28.4.2016 v 10:41 mengdong.lin@linux.intel.com napsal(a): >>>> priv_data_size = ref->data->size; >>>> + elem->obj = realloc(elem->obj, >>>> + elem->size + priv_data_size); >>>> + if (!elem->obj) >>>> + return -ENOMEM; >>> >>> This causes a memory leak when realloc fails. You should free the >>> original pointer when realloc() fails. >> >> Right, and the bug (the leak) has been already present before the patch... >> > > Okay, we'll fix this. Thanks for pointing out this. > I fixed this issue in v2 series. Would you please have a review? Thanks again Mengdong
On Wed, 04 May 2016 03:29:33 +0200, Mengdong Lin wrote: > > > > On 04/28/2016 10:30 PM, Lin, Mengdong wrote: > >> -----Original Message----- > >> From: Takashi Iwai [mailto:tiwai@suse.de] > >> Sent: Thursday, April 28, 2016 9:55 PM > >> To: Jaroslav Kysela > >> Cc: mengdong.lin@linux.intel.com; alsa-devel@alsa-project.org; > >> broonie@kernel.org; Girdwood, Liam R; Lin, Mengdong; Shah, Hardik T; Singh, > >> Guneshwor O > >> Subject: Re: [PATCH 3/6] topology: Use generic pointer to realloc buffer for > >> private data > >> > >> On Thu, 28 Apr 2016 10:48:36 +0200, > >> Jaroslav Kysela wrote: > >>> > >>> Dne 28.4.2016 v 10:41 mengdong.lin@linux.intel.com napsal(a): > >>>> priv_data_size = ref->data->size; > >>>> + elem->obj = realloc(elem->obj, > >>>> + elem->size + priv_data_size); > >>>> + if (!elem->obj) > >>>> + return -ENOMEM; > >>> > >>> This causes a memory leak when realloc fails. You should free the > >>> original pointer when realloc() fails. > >> > >> Right, and the bug (the leak) has been already present before the patch... > >> > > > > Okay, we'll fix this. Thanks for pointing out this. > > > > I fixed this issue in v2 series. Would you please have a review? Now I'm back to online. Will start reviewing the series in tomorrow or so. thanks, Takashi
diff --git a/src/topology/data.c b/src/topology/data.c index 19c31bf..6606ca9 100644 --- a/src/topology/data.c +++ b/src/topology/data.c @@ -827,39 +827,29 @@ int tplg_copy_data(struct tplg_elem *elem, struct tplg_elem *ref) return -EINVAL; tplg_dbg("Data '%s' used by '%s'\n", ref->id, elem->id); + if (!ref->data || !ref->data->size) /* overlook empty private data */ + return 0; + priv_data_size = ref->data->size; + elem->obj = realloc(elem->obj, + elem->size + priv_data_size); + if (!elem->obj) + return -ENOMEM; switch (elem->type) { case SND_TPLG_TYPE_MIXER: - elem->mixer_ctrl = realloc(elem->mixer_ctrl, - elem->size + priv_data_size); - if (!elem->mixer_ctrl) - return -ENOMEM; priv = &elem->mixer_ctrl->priv; break; case SND_TPLG_TYPE_ENUM: - elem->enum_ctrl = realloc(elem->enum_ctrl, - elem->size + priv_data_size); - if (!elem->enum_ctrl) - return -ENOMEM; priv = &elem->enum_ctrl->priv; break; case SND_TPLG_TYPE_BYTES: - elem->bytes_ext = realloc(elem->bytes_ext, - elem->size + priv_data_size); - if (!elem->bytes_ext) - return -ENOMEM; priv = &elem->bytes_ext->priv; break; - case SND_TPLG_TYPE_DAPM_WIDGET: - elem->widget = realloc(elem->widget, - elem->size + priv_data_size); - if (!elem->widget) - return -ENOMEM; priv = &elem->widget->priv; break;