[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