Re: [PATCH] staging: line6: fix possible overrun

2014-04-26 Thread Mateusz Guzik
On Sat, Apr 26, 2014 at 07:09:22PM +0200, Laurent Navet wrote:
> The strcpy operation may write past the end of the fixed-size destination
> buffer if the source buffer is too large.
> 
> Found by coverity scan : CID 144979
> 
> Signed-off-by: Laurent Navet 
> ---
> build tested only
> 
>  drivers/staging/line6/audio.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/staging/line6/audio.c b/drivers/staging/line6/audio.c
> index 171d80c..65f5cd4 100644
> --- a/drivers/staging/line6/audio.c
> +++ b/drivers/staging/line6/audio.c
> @@ -32,9 +32,10 @@ int line6_init_audio(struct usb_line6 *line6)
>  
>   line6->card = card;
>  
> - strcpy(card->id, line6->properties->id);
> + strncpy(card->id, line6->properties->id, (sizeof(card->id)-1));
>   strcpy(card->driver, DRIVER_NAME);
> - strcpy(card->shortname, line6->properties->name);
> + strncpy(card->shortname, line6->properties->name,
> + (sizeof(card->shortname)-1));
>   /* longname is 80 chars - see asound.h */
>   sprintf(card->longname, "Line6 %s at USB %s", line6->properties->name,
>       dev_name(line6->ifcdev));

Would not it be better to return -EINVAL (or some other error) instead?

Now you will possibly truncate the name.

-- 
Mateusz Guzik
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH] staging: line6: fix possible overrun

2014-04-26 Thread Mateusz Guzik
On Sun, Apr 27, 2014 at 12:36:21AM +0300, Dan Carpenter wrote:
> On Sat, Apr 26, 2014 at 10:47:05PM +0200, Mateusz Guzik wrote:
> > On Sat, Apr 26, 2014 at 07:09:22PM +0200, Laurent Navet wrote:
> > > The strcpy operation may write past the end of the fixed-size destination
> > > buffer if the source buffer is too large.
> > > 
> > > Found by coverity scan : CID 144979
> > > 
> > > Signed-off-by: Laurent Navet 
> > > ---
> > > build tested only
> > > 
> > >  drivers/staging/line6/audio.c | 5 +++--
> > >  1 file changed, 3 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/drivers/staging/line6/audio.c b/drivers/staging/line6/audio.c
> > > index 171d80c..65f5cd4 100644
> > > --- a/drivers/staging/line6/audio.c
> > > +++ b/drivers/staging/line6/audio.c
> > > @@ -32,9 +32,10 @@ int line6_init_audio(struct usb_line6 *line6)
> > >  
> > >   line6->card = card;
> > >  
> > > - strcpy(card->id, line6->properties->id);
> > > + strncpy(card->id, line6->properties->id, (sizeof(card->id)-1));
> > >   strcpy(card->driver, DRIVER_NAME);
> > > - strcpy(card->shortname, line6->properties->name);
> > > + strncpy(card->shortname, line6->properties->name,
> > > + (sizeof(card->shortname)-1));
> > >   /* longname is 80 chars - see asound.h */
> > >   sprintf(card->longname, "Line6 %s at USB %s", line6->properties->name,
> > >   dev_name(line6->ifcdev));
> > 
> > Would not it be better to return -EINVAL (or some other error) instead?
> > 
> > Now you will possibly truncate the name.
> > 
> 
> These don't come from the user, they come from the kernel.
> 
> drivers/staging/line6/driver.c
> 59  
> 60  #define L6PROP(dev_bit, dev_id, dev_name, dev_cap)\
> 61  {.device_bit = LINE6_BIT_##dev_bit, .id = dev_id,\
> 62   .name = dev_name, .capabilities = LINE6_BIT_##dev_cap}
> 63  
> 64  /* *INDENT-OFF* */
> 65  static const struct line6_properties line6_properties_table[] = {
> 66  L6PROP(BASSPODXT, "BassPODxt", "BassPODxt",
> CTRL_PCM_HW),
> 67  L6PROP(BASSPODXTLIVE, "BassPODxtLive", "BassPODxt Live",   
> CTRL_PCM_HW),
> 68  L6PROP(BASSPODXTPRO,  "BassPODxtPro",  "BassPODxt Pro",
> CTRL_PCM_HW),
> 69  L6PROP(GUITARPORT,"GuitarPort","GuitarPort",   
> PCM),
> 70  L6PROP(POCKETPOD, "PocketPOD", "Pocket POD",   
> CONTROL),
> 71  L6PROP(PODHD300,  "PODHD300",  "POD HD300",
> CTRL_PCM_HW),
> 72  L6PROP(PODHD400,  "PODHD400",  "POD HD400",
> CTRL_PCM_HW),
> 73  L6PROP(PODHD500,  "PODHD500",  "POD HD500",
> CTRL_PCM_HW),
> 74  L6PROP(PODSTUDIO_GX,  "PODStudioGX",   "POD Studio GX",
> PCM),
> 75  L6PROP(PODSTUDIO_UX1, "PODStudioUX1",  "POD Studio UX1",   
> PCM),
> 76  L6PROP(PODSTUDIO_UX2, "PODStudioUX2",  "POD Studio UX2",   
> PCM),
> 77  L6PROP(PODX3, "PODX3", "POD X3",   
> PCM),
> 78  L6PROP(PODX3LIVE, "PODX3Live", "POD X3 Live",  
> PCM),
> 79  L6PROP(PODXT, "PODxt", "PODxt",
> CTRL_PCM_HW),
> 80  L6PROP(PODXTLIVE, "PODxtLive", "PODxt Live",   
> CTRL_PCM_HW),
> 81  L6PROP(PODXTPRO,  "PODxtPro",  "PODxt Pro",
> CTRL_PCM_HW),
> 82  L6PROP(TONEPORT_GX,   "TonePortGX","TonePort GX",  
> PCM),
> 83  L6PROP(TONEPORT_UX1,  "TonePortUX1",   "TonePort UX1", 
> PCM),
> 84  L6PROP(TONEPORT_UX2,  "TonePortUX2",   "TonePort UX2", 
> PCM),
> 85  L6PROP(VARIAX,"Variax","Variax Workbench", 
> CONTROL),
> 86  };
> 87  /* *INDENT-ON* */
> 88  
> 
> And sadly enough some of those ->id strings are more than 15 characters
> and a NUL which will fit in card->id.  So this overflow is real.  The
> card->shortname is a 32 char array so none of those overflow.
> 
> If we want to sovle the truncation issue then we need to think of
> shorter names for BassPODxtLive, BassPODxtPro, PODStudioUX1, and
> PODStudioUX2.
> 

In that case I suggest compile time assertions that ids and names fit and
a WARN_ON + -EINVAL in line6_init_audio to catch future offenders.

As a side note I'm not sure if pod_try_init from drivers/staging/line6/pod.c
cleans up properly after failed line6_init_audio.

-- 
Mateusz Guzik
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH] staging: line6: fix possible overrun

2014-04-27 Thread Mateusz Guzik
On Sun, Apr 27, 2014 at 08:39:32PM +0300, Dan Carpenter wrote:
> On Sat, Apr 26, 2014 at 11:59:46PM +0200, Mateusz Guzik wrote:
> > > And sadly enough some of those ->id strings are more than 15 characters
> > > and a NUL which will fit in card->id.  So this overflow is real.  The
> > > card->shortname is a 32 char array so none of those overflow.
> > > 
> > > If we want to sovle the truncation issue then we need to think of
> > > shorter names for BassPODxtLive, BassPODxtPro, PODStudioUX1, and
> > > PODStudioUX2.
> > > 
> > 
> > In that case I suggest compile time assertions that ids and names fit
> 
> That sounds like some magic code which I would love to see.  :)
> 

Just asserting something on compile time is not a problem.

The kernel has BUILD_BUG_ON macro. I didn't check why, but it doesn't
use _Static_assert. Instead it produces some code which makes it
unusable in this context.

Aforementoined _Static_assert is available at least in gcc and clang and
you can call it outside of any function, e.g.:
_Static_assert(sizeof(meh) < 42, "oh no");

Unfortnately I failed to come up with a macro which would allow me to use
it in the initializer. :/

One could change line6_properties's definition so that it contains
arrays instead of pointers, that would introduce automagic checking and
I don't think memory waste (if any) would be problematic.

> >  and a WARN_ON + -EINVAL in line6_init_audio to catch future
> >  offenders.
> 
> Returning -EINVAL is a bad idea because it would break the driver
> completely and make it unusable.
> 

Well I would vote for returning the error anyway. Something is wrong,
better fix it as it is instead of risking additional bugs resulting
from truncation.


> > 
> > As a side note I'm not sure if pod_try_init from drivers/staging/line6/pod.c
> > cleans up properly after failed line6_init_audio.
> 
> Yeah.  It doesn't seem to clean up at all.
> 

-- 
Mateusz Guzik
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH] staging: line6: fix possible overrun

2014-04-29 Thread Mateusz Guzik
On Tue, Apr 29, 2014 at 04:47:11PM +0200, Takashi Iwai wrote:
> At Mon, 28 Apr 2014 01:44:25 +0300,
> Dan Carpenter wrote:
> > 
> > On Sun, Apr 27, 2014 at 10:00:43PM +0200, Mateusz Guzik wrote:
> > > > >  and a WARN_ON + -EINVAL in line6_init_audio to catch future
> > > > >  offenders.
> > > > 
> > > > Returning -EINVAL is a bad idea because it would break the driver
> > > > completely and make it unusable.
> > > > 
> > > 
> > > Well I would vote for returning the error anyway.
> > 
> > I'm trying to be polite, but you are talking about adding regressions
> > deliberately...
> > 
> > It's very rare for people to deliberately add regressions to the kernel.
> > I have only seen it one time before.
> 
> I don't think Dan would be against returning -EINVAL if all the
> offender codes have been fixed (e.g. truncating strings to fit with
> the fixed arrays) at first.  Then it'd be a good help to catch any
> future bugs.  But, having -EINVAL without fixing the caller side means
> essentially that you're introducing the breakage intentionally
> although you know it certainly breaks, which is obviously bad.
> 
> 

We clearly have a serious miscommunication here (and apparently it
started with me not addressing the concern of complete driver breakage).

line6_init_audio consumers have to be fixed first, no doubt about that.

I was only commenting on catching *future* offenders, which I thought
would implictly mean *afterwards*.

With that in mind it would seem we are in agreement after all. :-)

As far getting this done maybe OP is interested.

-- 
Mateusz Guzik
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH] staging: rtl8723au: fix potential leak in update_bcn_wps_ie()

2014-05-01 Thread Mateusz Guzik
On Thu, May 01, 2014 at 01:57:27PM +0200, Christian Engelmayer wrote:
> Fix a potential leak in the error path of function update_bcn_wps_ie().
> Make sure that allocated memory for 'pbackup_remainder_ie' is freed
> upon return. Detected by Coverity - CID 1077718.
> 

if (remainder_ielen > 0) {
pbackup_remainder_ie = kmalloc(remainder_ielen, GFP_ATOMIC);
if (pbackup_remainder_ie)
memcpy(pbackup_remainder_ie, premainder_ie,
   remainder_ielen);
}

pwps_ie_src = pmlmepriv->wps_beacon_ie;
if (pwps_ie_src == NULL)
return;


Maybe just check pwps_ie_src earlier?

-- 
Mateusz Guzik
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel