mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-11-03 09:01:52 -05:00
Fix bogus value when no user TLV is defined
Check whether non-zero size TLV is really returned by comparing with the pre-filled pattern. ALSA 1.0.12 driver doesn't notify the error even if user TLV is empty, so the previous value is passed bogusly.
This commit is contained in:
parent
042df4e80a
commit
d5caee8d36
1 changed files with 14 additions and 1 deletions
|
|
@ -455,8 +455,21 @@ static int snd_ctl_tlv_do(snd_ctl_t *ctl, int op_flag,
|
|||
int snd_ctl_elem_tlv_read(snd_ctl_t *ctl, const snd_ctl_elem_id_t *id,
|
||||
unsigned int *tlv, unsigned int tlv_size)
|
||||
{
|
||||
int err;
|
||||
assert(ctl && id && (id->name[0] || id->numid) && tlv);
|
||||
return snd_ctl_tlv_do(ctl, 0, id, tlv, tlv_size);
|
||||
if (tlv_size < 2 * sizeof(int))
|
||||
return -EINVAL;
|
||||
/* 1.0.12 driver doesn't return the error even if the user TLV
|
||||
* is empty. So, initialize TLV here with an invalid type
|
||||
* and compare the returned value after ioctl for checking
|
||||
* the validity of TLV.
|
||||
*/
|
||||
tlv[0] = -1;
|
||||
tlv[1] = 0;
|
||||
err = snd_ctl_tlv_do(ctl, 0, id, tlv, tlv_size);
|
||||
if (err >= 0 && tlv[0] == -1)
|
||||
err = -ENXIO;
|
||||
return err;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue