[alsa-devel] valgrind error in snd_tlv_get_dB_range

Takashi Iwai tiwai at suse.de
Mon Jan 20 10:42:43 CET 2014


At Sun, 19 Jan 2014 16:22:47 +0400,
Ivan Sorokin wrote:
> 
> 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

Good catch.  Care to send a proper fix patch?


thanks,

Takashi

> 
> > 			return -EFAULT;
> > 		memcpy(tlv, xtlv->tlv, xtlv->tlv[1] + 2 * sizeof(unsigned int));
> > 	}
> > 	free(xtlv);
> > 	return 0;
> 
> 
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel at alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
> 


More information about the Alsa-devel mailing list