[alsa-devel] [PATCH v2 2/2] topology: Fix the missing referenced elem ptr when merging private data

Takashi Sakamoto o-takashi at sakamocchi.jp
Fri Jul 22 05:28:11 CEST 2016


On Jul 22 2016 11:39, Lin, Mengdong wrote:
>> -----Original Message-----
>> From: Takashi Sakamoto [mailto:o-takashi at sakamocchi.jp]
>> Sent: Friday, July 22, 2016 10:16 AM
>> To: mengdong.lin at linux.intel.com; alsa-devel at alsa-project.org;
>> broonie at kernel.org
>> Cc: tiwai at suse.de; Lin, Mengdong; Girdwood, Liam R; Nc, Shreyas
>> Subject: Re: [PATCH v2 2/2] topology: Fix the missing referenced elem ptr
>> when merging private data
>>
>> On Jul 22 2016 10:47, mengdong.lin at linux.intel.com wrote:
>>> From: Mengdong Lin <mengdong.lin at linux.intel.com>
>>>
>>> tplg_copy_data() should set the valid referenced data element pointer
>>> on success. The caller will double check this pointer for all kinds of
>>> references, including controls and data.
>>>
>>> Signed-off-by: Mengdong Lin <mengdong.lin at linux.intel.com>
>>>
>>> diff --git a/src/topology/data.c b/src/topology/data.c index
>>> 768fc27..e7793b2 100644
>>> --- a/src/topology/data.c
>>> +++ b/src/topology/data.c
>>> @@ -1078,6 +1078,8 @@ int tplg_copy_data(snd_tplg_t *tplg, struct
>> tplg_elem *elem,
>>>    	ref_elem->compound_elem = 1;
>>>    	memcpy(priv->data + old_priv_data_size,
>>>    	       ref_elem->data->data, priv_data_size);
>>> +
>>> +	ref->elem = ref_elem;
>>>    	return 0;
>>>    }
>>
>> Is this really OK when the found topology element has no private data?
>> In this case, ref->elem has no assignment at return.
>
> No. This is my mistake. Thanks for finding this bug.
>
> ref->elem should still be assigned for this case. I will make it like this:
>
> /* overlook empty private data */
> if (!ref_elem->data || !ref_elem->data->size) {
> 		ref->elem = ref_elem;
>           return 0;
> }

Let us split data merging code to an explicit function? Then:

if (ref_elem->data != NULL && ref_elem->data->size > 0) {
     err = merge_private_data(elem, ref_elem);
     if (err < 0)
         return err;
}
ref->elem = ref_elem;
return 0;

(Here, I expect compiler optimization to merge the new function to 
caller implicitly.)


Regards

Takashi Sakamoto


More information about the Alsa-devel mailing list