diff options
author | Pankaj Bharadiya <pankaj.laxminarayan.bharadiya@intel.com> | 2017-01-09 13:42:14 +0530 |
---|---|---|
committer | Pankaj Bharadiya <pankaj.laxminarayan.bharadiya@intel.com> | 2017-01-10 13:50:53 +0530 |
commit | 3f813e47784674a3909fe1277bc10b70d03791e2 (patch) | |
tree | c3a50bce2368bc86549907aa784e8b1b638de3a4 /src | |
parent | 9698d03a63b89fd5a2a2d775bcfc542812da54d9 (diff) |
Fix the byte control set/get method
The TLV byte controls expect a TLV header as well. Check for TLV
access and add TLV header size before invoking mixer API.
Change-Id: I12ba129e5bbc0676e80eb920e85b3683decfe0db
Signed-off-by: Pawse, GuruprasadX <guruprasadx.pawse@intel.com>
Signed-off-by: Pankaj Bharadiya <pankaj.laxminarayan.bharadiya@intel.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/mixer.c | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/src/mixer.c b/src/mixer.c index daa04f7..b7239fd 100644 --- a/src/mixer.c +++ b/src/mixer.c @@ -590,8 +590,20 @@ int mixer_ctl_get_array(const struct mixer_ctl *ctl, void *array, size_t count) int ret = 0; size_t size; void *source; + size_t total_count; - if (!ctl || (count > ctl->info.count) || !count || !array) + if ((!ctl) || !count || !array) + return -EINVAL; + + total_count = ctl->info.count; + + if ((ctl->info.type == SNDRV_CTL_ELEM_TYPE_BYTES) && + (mixer_ctl_is_access_tlv_rw(ctl))) { + /* Additional two words is for the TLV header */ + total_count += TLV_HEADER_SIZE; + } + + if (count > total_count) return -EINVAL; memset(&ev, 0, sizeof(ev)); @@ -714,8 +726,20 @@ int mixer_ctl_set_array(struct mixer_ctl *ctl, const void *array, size_t count) struct snd_ctl_elem_value ev; size_t size; void *dest; + size_t total_count; + + if ((!ctl) || !count || !array) + return -EINVAL; + + total_count = ctl->info.count; + + if ((ctl->info.type == SNDRV_CTL_ELEM_TYPE_BYTES) && + (mixer_ctl_is_access_tlv_rw(ctl))) { + /* Additional TLV header */ + total_count += TLV_HEADER_SIZE; + } - if (!ctl || (count > ctl->info.count) || !count || !array) + if (count > total_count) return -EINVAL; memset(&ev, 0, sizeof(ev)); |