[alsa-devel] valgrind error in snd_tlv_get_dB_range
Ivan Sorokin
vanyacpp at gmail.com
Sun Jan 19 13:22:47 CET 2014
On 19.01.2014 14:16, Ivan Sorokin wrote:
> I tried to trace problem in snd_hctl_elem_tlv_read, but I failed to do
> so due to lack of experience with alsa-lib.
>
> Could someone more experienced with alsa-lib look at the problem?
After a bit more investigation I've found that tlv is initialized in
snd_ctl_hw_elem_tlv with memcpy in line 245. This initialization looks
perfectly correct. So perhaps this is a error in valgrind (unimplemented
ioctl).
P.S. I believe I found a memory leak:
> switch (op_flag) {
> case -1: inum = SNDRV_CTL_IOCTL_TLV_COMMAND; break;
> case 0: inum = SNDRV_CTL_IOCTL_TLV_READ; break;
> case 1: inum = SNDRV_CTL_IOCTL_TLV_WRITE; break;
> default: return -EINVAL;
> }
> xtlv = malloc(sizeof(struct snd_ctl_tlv) + tlv_size);
> if (xtlv == NULL)
> return -ENOMEM;
> xtlv->numid = numid;
> xtlv->length = tlv_size;
> memcpy(xtlv->tlv, tlv, tlv_size);
> if (ioctl(hw->fd, inum, xtlv) < 0) {
> free(xtlv);
> return -errno;
> }
> if (op_flag == 0) {
> if (xtlv->tlv[1] + 2 * sizeof(unsigned int) > tlv_size)
missing free(xtlv) here
> return -EFAULT;
> memcpy(tlv, xtlv->tlv, xtlv->tlv[1] + 2 * sizeof(unsigned int));
> }
> free(xtlv);
> return 0;
More information about the Alsa-devel
mailing list