[bug report] ALSA: hda - Don't register a cb func if it is registered already
Hui Wang
hui.wang at canonical.com
Wed Oct 21 17:03:11 CEST 2020
Looks like this will not bring problem on patch_sigmatel.c, NULL and
valid kernel pointer are same for IS_ERR(), they will not make IS_ERR()
come true.
On 10/21/20 10:21 PM, Hui Wang wrote:
>
> On 10/21/20 8:19 PM, Dan Carpenter wrote:
>> Hello Hui Wang,
>>
>> The patch f4794c6064a8: "ALSA: hda - Don't register a cb func if it
>> is registered already" from Sep 30, 2020, leads to the following
>> static checker warning:
>>
>> sound/pci/hda/patch_sigmatel.c:3075 stac92hd71bxx_fixup_hp_m4()
>> warn: 'jack' can also be NULL
>>
>> sound/pci/hda/patch_sigmatel.c
>> 3069 /* Enable VREF power saving on GPIO1 detect */
>> 3070 snd_hda_codec_write_cache(codec, codec->core.afg, 0,
>> 3071 AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02);
>> 3072 jack = snd_hda_jack_detect_enable_callback(codec,
>> codec->core.afg,
>> 3073 stac_vref_event);
>>
>> Originally snd_hda_jack_detect_enable_callback() would not return NULL
>> here.
>>
>> 3074 if (!IS_ERR(jack))
>> 3075 jack->private_data = 0x02;
>> 3076
>> 3077 spec->gpio_mask |= 0x02;
>>
>> But now we have this:
>>
>> sound/pci/hda/hda_jack.c
>> 301 struct hda_jack_callback *
>> 302 snd_hda_jack_detect_enable_callback_mst(struct hda_codec
>> *codec, hda_nid_t nid,
>> 303 int dev_id,
>> hda_jack_callback_fn func)
>> 304 {
>> 305 struct hda_jack_tbl *jack;
>> 306 struct hda_jack_callback *callback = NULL;
>> 307 int err;
>> 308
>> 309 jack = snd_hda_jack_tbl_new(codec, nid, dev_id);
>> 310 if (!jack)
>> 311 return ERR_PTR(-ENOMEM);
>> 312 if (func && !func_is_already_in_callback_list(jack,
>> func)) {
>> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>> We only allocate callback if there isn't one already.
> Yes, indeed, this is a problem.
>>
>> 313 callback = kzalloc(sizeof(*callback),
>> GFP_KERNEL);
>> 314 if (!callback)
>> 315 return ERR_PTR(-ENOMEM);
>> 316 callback->func = func;
>> 317 callback->nid = jack->nid;
>> 318 callback->dev_id = jack->dev_id;
>> 319 callback->next = jack->callback;
>> 320 jack->callback = callback;
>> 321 }
>> 322
>> 323 if (jack->jack_detect)
>> 324 return callback; /* already registered */
>> ^^^^^^^^^^^^^^^
>> So presumably this should be jack->callback
>
> Looks like it is also not correct to return the jack->callback. Need
> to take some time to write a fix for it.
>
>
> Thanks for reporting the issue.
>
>>
>>
>> 325 jack->jack_detect = 1;
>> 326 if (codec->jackpoll_interval > 0)
>> 327 return callback; /* No unsol if we're
>> polling instead */
>> ^^^^^^^^^^^^^^^^
>>
>> 328 err = snd_hda_codec_write_cache(codec, nid, 0,
>> 329 AC_VERB_SET_UNSOLICITED_ENABLE,
>> 330 AC_USRSP_EN |
>> jack->tag);
>> 331 if (err < 0)
>> 332 return ERR_PTR(err);
>> 333 return callback;
>> ^^^^^^^^^^^^^^^^
>> And these as well.
>>
>> 334 }
>>
>> regards,
>> dan carpenter
More information about the Alsa-devel
mailing list