From: Michal Nazarewicz <mina86@mina86.com>
To: kernel-janitors@vger.kernel.org
Subject: Re: [patch] usb: gadget: f_fs: signedness bug in __ffs_func_bind_do_descs()
Date: Tue, 09 Sep 2014 16:37:02 +0000 [thread overview]
Message-ID: <xa1tha0g21jl.fsf@mina86.com> (raw)
In-Reply-To: <20140909120609.GB19760@mwanda>
On Tue, Sep 09 2014, Dan Carpenter <dan.carpenter@oracle.com> wrote:
> On Tue, Sep 09, 2014 at 03:57:26PM +0200, Michal Nazarewicz wrote:
>> On Tue, Sep 09 2014, Dan Carpenter <dan.carpenter@oracle.com> wrote:
>> > Btw, there is a sparse warning:
>> >
>> > drivers/usb/gadget/function/f_fs.c:401:44: warning: Variable length array is used.
>> >
>> > The risk here is that the array would be too large. I don't know the
>> > code well enough to say if it can be triggered, but from an outsider
>> > perspective it looks scary (security implications). There should be a
>> > comment explaining why it can't be used to overflow the 8k stack.
>>
>> n in that function can be at most 4
>
> I looked for where this limit is set but couldn't figure it out. Which
> function is it?
The limit is never explicitly set, but logic in this function guarantees
it:
static void __ffs_event_add(struct ffs_data *ffs,
enum usb_functionfs_event_type type)
{
enum usb_functionfs_event_type rem_type1, rem_type2 = type;
int neg = 0;
/*
* Abort any unhandled setup
*
* We do not need to worry about some cmpxchg() changing value
* of ffs->setup_state without holding the lock because when
* state is FFS_SETUP_PENDING cmpxchg() in several places in
* the source does nothing.
*/
if (ffs->setup_state = FFS_SETUP_PENDING)
ffs->setup_state = FFS_SETUP_CANCELLED;
switch (type) {
case FUNCTIONFS_RESUME:
rem_type2 = FUNCTIONFS_SUSPEND;
/* FALL THROUGH */
case FUNCTIONFS_SUSPEND:
case FUNCTIONFS_SETUP:
rem_type1 = type;
/* Discard all similar events */
break;
case FUNCTIONFS_BIND:
case FUNCTIONFS_UNBIND:
case FUNCTIONFS_DISABLE:
case FUNCTIONFS_ENABLE:
/* Discard everything other then power management. */
rem_type1 = FUNCTIONFS_SUSPEND;
rem_type2 = FUNCTIONFS_RESUME;
neg = 1;
break;
default:
BUG();
}
{
u8 *ev = ffs->ev.types, *out = ev;
unsigned n = ffs->ev.count;
for (; n; --n, ++ev)
if ((*ev = rem_type1 || *ev = rem_type2) = neg)
*out++ = *ev;
else
pr_vdebug("purging event %d\n", *ev);
ffs->ev.count = out - ffs->ev.types;
}
pr_vdebug("adding event %d\n", type);
ffs->ev.types[ffs->ev.count++] = type;
wake_up_locked(&ffs->ev.waitq);
}
Looking at the last four cases, BIND, UNBIND, DISABLE and ENABLE events
will never be present on the event list at the same time. Since there's
only three more event types, this means that the list can contain at
most four events.
So ffs->ev.count <= 4, and since __ffs_ep0_read_events is called with
n = min(n, (size_t)ffs->ev.count)), n <= 4.
--
Best regards, _ _
.o. | Liege of Serenely Enlightened Majesty of o' \,=./ `o
..o | Computer Science, Michał “mina86” Nazarewicz (o o)
ooo +--<mpn@google.com>--<xmpp:mina86@jabber.org>--ooO--(_)--Ooo--
next prev parent reply other threads:[~2014-09-09 16:37 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-09 12:06 [patch] usb: gadget: f_fs: signedness bug in __ffs_func_bind_do_descs() Dan Carpenter
2014-09-09 13:57 ` Michal Nazarewicz
2014-09-09 14:25 ` Dan Carpenter
2014-09-09 16:37 ` Michal Nazarewicz [this message]
2014-09-09 16:40 ` Felipe Balbi
2014-09-10 11:05 ` Dan Carpenter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xa1tha0g21jl.fsf@mina86.com \
--to=mina86@mina86.com \
--cc=kernel-janitors@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox