[alsa-devel] [PATCH 3/3] ALSA: core: set kcontrol's count field correctly

Takashi Iwai tiwai at suse.de
Wed Aug 24 08:26:47 CEST 2011


At Wed, 24 Aug 2011 14:17:57 +0800,
Lu Guanqun wrote:
> 
> On Wed, Aug 24, 2011 at 02:06:34PM +0800, Takashi Iwai wrote:
> > At Wed, 24 Aug 2011 11:12:43 +0800,
> > Lu Guanqun wrote:
> > > 
> > > I don't see how info's owner field relates to kcontrol's count field. It should
> > > assign to info's count instead.
> > > 
> > > Let's assume this scenario:
> > > 
> > > 1. user reads the control element from kernel (the owner field is set)
> > > 2. user changes some values
> > > 3. user issues 'SNDRV_CTL_IOCTL_ELEM_REPLACE' ioctl.
> > > 
> > > With the original code, 'kctl' here gets a large count number due to its
> > > non-empty owner field. Therefore it fails on subsequent call snd_ctl_new().
> > 
> > In IOCTL_ELEM_ADD and REPLACE, count and owner struct fields have
> > different meanings from others.  The count contains the array size,
> > not the number of identical elements.  And the owner contains the
> > number of elements to be created.  So, the current code is correct.
> 
> This sounds tricky...
> 
> in snd_ctl_elem_info():
> 	info->owner = pid_vnr(vd->owner->pid);
> } else {
> 	info->owner = -1;
> 
> This is where owner of info get assigned, but it's not number of
> elements to be created.

The kcontrol.count field is never exposed to user-space.

> I'm a bit unclear on this.
> 
> > 
> > What we need is the documentation of this feature...
> 
> So my test case seems to be wrong, but how should I change it? Do I need
> to clear the owner field when user space application sends down the
> REPLACE ioctl?

Yes.  Maybe it'd be better to define a new struct and use it in
ADD/REPLACE ioctls so that user sees a clear difference.  The struct
will be identical except for renaming from owner to elem_count or
such.


Takashi


More information about the Alsa-devel mailing list