diff mbox series

control_hw: Fix issue when applying seccomp policy

Message ID 20180815081750.70746-1-hychao@chromium.org (mailing list archive)
State New, archived
Headers show
Series control_hw: Fix issue when applying seccomp policy | expand

Commit Message

Hsin-Yu Chao Aug. 15, 2018, 8:17 a.m. UTC
When seccomp policy is applied to filter ioctl syscall with
SNDRV_CTL_IOCTL_TLV_COMMAND, SNDRV_CTL_IOCTL_TLV_READ and
SNDRV_CTL_IOCTL_TLV_WRITE in whiltelist, alsa-lib still breaks
in at snd_ctl_hw_elem_tlv().
Fix the problem by passing unsigned int to ioctl.

Signed-off-by: Hsin-Yu Chao <hychao@chromium.org>
---
 src/control/control_hw.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Takashi Iwai Aug. 15, 2018, 9:37 a.m. UTC | #1
On Wed, 15 Aug 2018 10:17:50 +0200,
Hsin-Yu Chao wrote:
> 
> When seccomp policy is applied to filter ioctl syscall with
> SNDRV_CTL_IOCTL_TLV_COMMAND, SNDRV_CTL_IOCTL_TLV_READ and
> SNDRV_CTL_IOCTL_TLV_WRITE in whiltelist, alsa-lib still breaks
> in at snd_ctl_hw_elem_tlv().
> Fix the problem by passing unsigned int to ioctl.

Could you explain exactly what breaks and how?


thanks,

Takashi

> 
> Signed-off-by: Hsin-Yu Chao <hychao@chromium.org>
> ---
>  src/control/control_hw.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/src/control/control_hw.c b/src/control/control_hw.c
> index 68eca522..b54d65f2 100644
> --- a/src/control/control_hw.c
> +++ b/src/control/control_hw.c
> @@ -215,7 +215,7 @@ static int snd_ctl_hw_elem_tlv(snd_ctl_t *handle, int op_flag,
>  			       unsigned int numid,
>  			       unsigned int *tlv, unsigned int tlv_size)
>  {
> -	int inum;
> +	unsigned int inum;
>  	snd_ctl_hw_t *hw = handle->private_data;
>  	struct snd_ctl_tlv *xtlv;
>  	
> -- 
> 2.18.0.865.gffc8e1a3cd6-goog
> 
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel@alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
>
Hsin-Yu Chao Aug. 16, 2018, 9:06 a.m. UTC | #2
The problem happens when I add seccomp filter to whiltelist syscall
"ioctl" with arguments of type 'U', for SNDRV_CTL_IOCTL_TLV_READ,
SNDRV_CTL_IOCTL_TLV_WRITE and SNDRV_CTL_IOCTL_TLV_COMMAND.
I was expecting snd_ctl_hw_elem_tlv() to run without problem, but
actually seeing it return error because of ioctl() call failure.

In control_hw.c, when the local int "inum" got passed to ioctl, it is
converted to "unsigned long".
Take SNDRV_CTL_IOCTL_TLV_WRITE as example, it will stretch to
0xffffffffc008551b.

This doesn't bring problem to snd function, I think it's because
snd_pcm_lib_ioctl takes "unsigned int cmd" as argument.
https://github.com/torvalds/linux/blob/master/sound/core/pcm_lib.c#L1769

However the seccomp_data struct takes 64 bits argument to check
against seccomp rules.
https://github.com/torvalds/linux/blob/master/arch/x86/entry/common.c#L104
and these unexpected 0xff bytes make the seccomp rule check fail.

Since ioctl takes "unsigned long" command, I think we should fix this
in alsa-lib as there is no intention to append the 0xff bytes to
kernel.

Thanks,
Hsin-yu

On Wed, Aug 15, 2018 at 5:37 PM Takashi Iwai <tiwai@suse.de> wrote:
>
> On Wed, 15 Aug 2018 10:17:50 +0200,
> Hsin-Yu Chao wrote:
> >
> > When seccomp policy is applied to filter ioctl syscall with
> > SNDRV_CTL_IOCTL_TLV_COMMAND, SNDRV_CTL_IOCTL_TLV_READ and
> > SNDRV_CTL_IOCTL_TLV_WRITE in whiltelist, alsa-lib still breaks
> > in at snd_ctl_hw_elem_tlv().
> > Fix the problem by passing unsigned int to ioctl.
>
> Could you explain exactly what breaks and how?
>
>
> thanks,
>
> Takashi
>
> >
> > Signed-off-by: Hsin-Yu Chao <hychao@chromium.org>
> > ---
> >  src/control/control_hw.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/src/control/control_hw.c b/src/control/control_hw.c
> > index 68eca522..b54d65f2 100644
> > --- a/src/control/control_hw.c
> > +++ b/src/control/control_hw.c
> > @@ -215,7 +215,7 @@ static int snd_ctl_hw_elem_tlv(snd_ctl_t *handle, int op_flag,
> >                              unsigned int numid,
> >                              unsigned int *tlv, unsigned int tlv_size)
> >  {
> > -     int inum;
> > +     unsigned int inum;
> >       snd_ctl_hw_t *hw = handle->private_data;
> >       struct snd_ctl_tlv *xtlv;
> >
> > --
> > 2.18.0.865.gffc8e1a3cd6-goog
> >
> > _______________________________________________
> > Alsa-devel mailing list
> > Alsa-devel@alsa-project.org
> > http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
> >
Takashi Iwai Aug. 16, 2018, 9:21 a.m. UTC | #3
On Thu, 16 Aug 2018 11:06:33 +0200,
Hsin-yu Chao wrote:
> 
> The problem happens when I add seccomp filter to whiltelist syscall
> "ioctl" with arguments of type 'U', for SNDRV_CTL_IOCTL_TLV_READ,
> SNDRV_CTL_IOCTL_TLV_WRITE and SNDRV_CTL_IOCTL_TLV_COMMAND.
> I was expecting snd_ctl_hw_elem_tlv() to run without problem, but
> actually seeing it return error because of ioctl() call failure.
> 
> In control_hw.c, when the local int "inum" got passed to ioctl, it is
> converted to "unsigned long".
> Take SNDRV_CTL_IOCTL_TLV_WRITE as example, it will stretch to
> 0xffffffffc008551b.
> 
> This doesn't bring problem to snd function, I think it's because
> snd_pcm_lib_ioctl takes "unsigned int cmd" as argument.
> https://github.com/torvalds/linux/blob/master/sound/core/pcm_lib.c#L1769
> 
> However the seccomp_data struct takes 64 bits argument to check
> against seccomp rules.
> https://github.com/torvalds/linux/blob/master/arch/x86/entry/common.c#L104
> and these unexpected 0xff bytes make the seccomp rule check fail.
> 
> Since ioctl takes "unsigned long" command, I think we should fix this
> in alsa-lib as there is no intention to append the 0xff bytes to
> kernel.

Thanks, that makes sense.

Could you add these background information concisely in the patch
description and resubmit?


Takashi

> 
> Thanks,
> Hsin-yu
> 
> On Wed, Aug 15, 2018 at 5:37 PM Takashi Iwai <tiwai@suse.de> wrote:
> >
> > On Wed, 15 Aug 2018 10:17:50 +0200,
> > Hsin-Yu Chao wrote:
> > >
> > > When seccomp policy is applied to filter ioctl syscall with
> > > SNDRV_CTL_IOCTL_TLV_COMMAND, SNDRV_CTL_IOCTL_TLV_READ and
> > > SNDRV_CTL_IOCTL_TLV_WRITE in whiltelist, alsa-lib still breaks
> > > in at snd_ctl_hw_elem_tlv().
> > > Fix the problem by passing unsigned int to ioctl.
> >
> > Could you explain exactly what breaks and how?
> >
> >
> > thanks,
> >
> > Takashi
> >
> > >
> > > Signed-off-by: Hsin-Yu Chao <hychao@chromium.org>
> > > ---
> > >  src/control/control_hw.c | 2 +-
> > >  1 file changed, 1 insertion(+), 1 deletion(-)
> > >
> > > diff --git a/src/control/control_hw.c b/src/control/control_hw.c
> > > index 68eca522..b54d65f2 100644
> > > --- a/src/control/control_hw.c
> > > +++ b/src/control/control_hw.c
> > > @@ -215,7 +215,7 @@ static int snd_ctl_hw_elem_tlv(snd_ctl_t *handle, int op_flag,
> > >                              unsigned int numid,
> > >                              unsigned int *tlv, unsigned int tlv_size)
> > >  {
> > > -     int inum;
> > > +     unsigned int inum;
> > >       snd_ctl_hw_t *hw = handle->private_data;
> > >       struct snd_ctl_tlv *xtlv;
> > >
> > > --
> > > 2.18.0.865.gffc8e1a3cd6-goog
> > >
> > > _______________________________________________
> > > Alsa-devel mailing list
> > > Alsa-devel@alsa-project.org
> > > http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
> > >
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel@alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
>
diff mbox series

Patch

diff --git a/src/control/control_hw.c b/src/control/control_hw.c
index 68eca522..b54d65f2 100644
--- a/src/control/control_hw.c
+++ b/src/control/control_hw.c
@@ -215,7 +215,7 @@  static int snd_ctl_hw_elem_tlv(snd_ctl_t *handle, int op_flag,
 			       unsigned int numid,
 			       unsigned int *tlv, unsigned int tlv_size)
 {
-	int inum;
+	unsigned int inum;
 	snd_ctl_hw_t *hw = handle->private_data;
 	struct snd_ctl_tlv *xtlv;