- Subject: Re: [patch] Fix handling of overlength pathname in AF_UNIX sun_path
- From: Thadeu Lima de Souza Cascardo <cascardo@xxxxxxxxxxxxxxxxxx>
- Date: Wed, 18 Apr 2012 10:13:18 -0300
- Cc: "Carlos O'Donell" <carlos@xxxxxxxxxxxxxxxx>, David Miller <davem@xxxxxxxxxxxxx>, mtk.manpages@xxxxxxxxx, netdev@xxxxxxxxxxxxxxx, penguin-kernel@xxxxxxxxxxxxxxxxxxx, linux-api@xxxxxxxxxxxxxxx, yoshfuji@xxxxxxxxxxxxxx, jengelh@xxxxxxxxxx, w@xxxxxx, alan@xxxxxxxxxxxxxxxxxxx
- In-reply-to: <AE90C24D6B3A694183C094C60CF0A2F6026B6EE2@saturn3.aculab.com>
- References: <CADZpyix6DZ93f8MQf3Aa1NVV7HCFMAXVAdzRMFBY7xWHHQMPog@mail.gmail.com> <AE90C24D6B3A694183C094C60CF0A2F6026B6EE2@saturn3.aculab.com>
- User-agent: Mutt/1.5.21 (2010-09-15)
On Wed, Apr 18, 2012 at 09:17:26AM +0100, David Laight wrote:
>
> >
> > Why not have:
> >
> > diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
> > index d510353..f9f77a7 100644
> > --- a/net/unix/af_unix.c
> > +++ b/net/unix/af_unix.c
> > @@ -216,6 +216,9 @@ static int unix_mkname(struct sockaddr_un
> > *sunaddr, int len, unsigned *hashp)
> > */
> > ((char *)sunaddr)[len] = 0;
> > len = strlen(sunaddr->sun_path)+1+sizeof(short);
> > + /* No null terminator was found in the path. */
> > + if (len > sizeof(*sunaddr))
> > + return -EINVAL;
> > return len;
>
> That could generate a kernel page fault!
> (Depending on what follows (or rather doesn't follow!) sun_path.)
> You'd need to use memchr() not strlen().
>
> David
>
Hi, David.
What follows is a 0 byte, because it's set that way in the line before
strlen. Note that len is tested for sizeof(*sunaddr), and there is a
huge comment about that extra byte that was omitted.
The whole function is at net/unix/af_unix.c:203.
Regards,
Cascardo.
--
To unsubscribe from this list: send the line "unsubscribe linux-api" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
[Home]
[Linux USB Devel]
[Video for Linux]
[Linux Audio Users]
[Photo]
[Yosemite News]
[Yosemite Photos]
[Free Online Dating]
[Linux Kernel]
[Linux SCSI]
[XFree86]