From: Marcel Holtmann <marcel@holtmann.org>
To: Andi Kleen <ak@suse.de>
Cc: bluez-devel@lists.sourceforge.net, netdev@oss.sgi.com,
viro@zenII.linux.org.uk
Subject: Re: some bluetooth fixes
Date: Sat, 07 Feb 2004 12:13:31 +0100 [thread overview]
Message-ID: <1076152411.14418.73.camel@pegasus> (raw)
In-Reply-To: <20040207032428.56ffbebc.ak@suse.de>
Hi Andi,
> > > diff -u linux-2.6.2-work32/net/bluetooth/hci_sock.c-o linux-2.6.2-work32/net/bluetooth/hci_sock.c
> > > --- linux-2.6.2-work32/net/bluetooth/hci_sock.c-o 2004-02-05 08:09:54.000000000 +0100
> > > +++ linux-2.6.2-work32/net/bluetooth/hci_sock.c 2004-02-05 14:57:59.000000000 +0100
> > > @@ -392,6 +392,8 @@
> > >
> > > skb->pkt_type = *((unsigned char *) skb->data);
> > > skb_pull(skb, 1);
> > > + /* AK: looks broken. Who guarantees that hdev doesn't go away while
> > > + the skb is queued ? */
> > > skb->dev = (void *) hdev;
> > >
> > > if (skb->pkt_type == HCI_COMMAND_PKT) {
> >
> > Why should hdev go away?
>
> Because the skbuff is queued, but there is no reference count to keep the device around.
> I wasn't 100% sure on that, so I just commented it. Feel free to remove if you think
> it's correct.
The queue itself is part of the hdev structure and the only call that
let hdev go away is hci_unregister_dev and this clears the queue. So I
don't see a problem here.
> > > diff -u linux-2.6.2-work32/net/bluetooth/hci_conn.c-o linux-2.6.2-work32/net/bluetooth/hci_conn.c
> > > --- linux-2.6.2-work32/net/bluetooth/hci_conn.c-o 2004-02-05 08:09:54.000000000 +0100
> > > +++ linux-2.6.2-work32/net/bluetooth/hci_conn.c 2004-02-05 15:06:10.000000000 +0100
> > > @@ -353,21 +353,24 @@
> > > struct hci_conn_info *ci;
> > > struct hci_dev *hdev;
> > > struct list_head *p;
> > > - int n = 0, size;
> > > + int n = 0, size, err;
> > >
> > > if (copy_from_user(&req, (void *) arg, sizeof(req)))
> > > return -EFAULT;
> > >
> > > - if (!(hdev = hci_dev_get(req.dev_id)))
> > > - return -ENODEV;
> > > + if (req.conn_num >= (2*PAGE_SIZE)/sizeof(struct hci_conn_info))
> > > + return -EINVAL;
> > >
> > > size = req.conn_num * sizeof(struct hci_conn_info) + sizeof(req);
> > >
> > > - if (verify_area(VERIFY_WRITE, (void *)arg, size))
> > > - return -EFAULT;
> > > -
> > > if (!(cl = (void *) kmalloc(size, GFP_KERNEL)))
> > > return -ENOMEM;
> > > +
> > > + if (!(hdev = hci_dev_get(req.dev_id))) {
> > > + kfree(cl);
> > > + return -ENODEV;
> > > + }
> > > +
> > > ci = cl->conn_info;
> > >
> > > hci_dev_lock_bh(hdev);
> >
> > Why 2*PAGE_SIZE in this case? What is different?
>
> It's just an arbitary number. Mainly to stop overflow attacks on
> user controlled values. e.g. user can pass UINT_MAX for conn_num.
> The kmalloc would overflow and succeed. But a later loop running
> through the values could do wrong things on the too small buffer.
> The code seems to not be vunerable to this, but only by luck.
>
> Also in general it's good practice to stop user controlled kmalloc
> at a reasonable size.
I check this. Maybe we have more of them. What do you propose as max
size value for kmalloc? 2*PAGE_SIZE or 4*PAGE_SIZE?
Regards
Marcel
next prev parent reply other threads:[~2004-02-07 11:13 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-02-06 4:00 some bluetooth fixes Andi Kleen
2004-02-06 14:58 ` Marcel Holtmann
2004-02-07 2:24 ` Andi Kleen
2004-02-07 11:13 ` Marcel Holtmann [this message]
2004-02-07 11:57 ` Andi Kleen
2004-02-07 16:57 ` Marcel Holtmann
2004-02-07 17:24 ` Andi Kleen
2004-02-11 18:55 ` Marcel Holtmann
2004-02-11 19:33 ` Andi Kleen
2004-02-11 20:47 ` Marcel Holtmann
2004-02-11 19:55 ` Andi Kleen
2004-02-06 23:30 ` Marcel Holtmann
2004-02-06 23:34 ` David S. Miller
2004-02-06 23:46 ` Marcel Holtmann
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=1076152411.14418.73.camel@pegasus \
--to=marcel@holtmann.org \
--cc=ak@suse.de \
--cc=bluez-devel@lists.sourceforge.net \
--cc=netdev@oss.sgi.com \
--cc=viro@zenII.linux.org.uk \
/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;
as well as URLs for NNTP newsgroup(s).