diff mbox

tc: Fix unitialized kernel memory leak

Message ID 4A9E67A9.7090205@gmail.com
State Accepted, archived
Delegated to: David Miller
Headers show

Commit Message

Eric Dumazet Sept. 2, 2009, 12:40 p.m. UTC
Three bytes of uninitialized kernel memory are currently leaked to user

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
---
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Jiri Pirko Sept. 2, 2009, 6:09 p.m. UTC | #1
Wed, Sep 02, 2009 at 02:40:09PM CEST, eric.dumazet@gmail.com wrote:
>Three bytes of uninitialized kernel memory are currently leaked to user
>
>Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>

Reviewed-by: Jiri Pirko <jpirko@redhat.com>

>---
>diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c
>index 24d17ce..fdb694e 100644
>--- a/net/sched/sch_api.c
>+++ b/net/sched/sch_api.c
>@@ -1456,6 +1456,8 @@ static int tc_fill_tclass(struct sk_buff *skb, struct Qdisc *q,
> 	nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*tcm), flags);
> 	tcm = NLMSG_DATA(nlh);
> 	tcm->tcm_family = AF_UNSPEC;
>+	tcm->tcm__pad1 = 0;
>+	tcm->tcm__pad2 = 0;
> 	tcm->tcm_ifindex = qdisc_dev(q)->ifindex;
> 	tcm->tcm_parent = q->handle;
> 	tcm->tcm_handle = q->handle;
>--
>To unsubscribe from this list: send the line "unsubscribe netdev" in
>the body of a message to majordomo@vger.kernel.org
>More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
stephen hemminger Sept. 2, 2009, 7:05 p.m. UTC | #2
On Wed, 02 Sep 2009 14:40:09 +0200
Eric Dumazet <eric.dumazet@gmail.com> wrote:

> Three bytes of uninitialized kernel memory are currently leaked to user
> 
> Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
> ---
> diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c
> index 24d17ce..fdb694e 100644
> --- a/net/sched/sch_api.c
> +++ b/net/sched/sch_api.c
> @@ -1456,6 +1456,8 @@ static int tc_fill_tclass(struct sk_buff *skb, struct Qdisc *q,
>  	nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*tcm), flags);
>  	tcm = NLMSG_DATA(nlh);
>  	tcm->tcm_family = AF_UNSPEC;
> +	tcm->tcm__pad1 = 0;
> +	tcm->tcm__pad2 = 0;
>  	tcm->tcm_ifindex = qdisc_dev(q)->ifindex;
>  	tcm->tcm_parent = q->handle;
>  	tcm->tcm_handle = q->handle;

Perhaps __nlmsg_put should just always call memset() for the whole
added chunk. It is not like it is critical path in any way, and
avoid any of this possible class of errors.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Miller Sept. 3, 2009, 5:51 a.m. UTC | #3
From: Stephen Hemminger <shemminger@vyatta.com>
Date: Wed, 2 Sep 2009 12:05:40 -0700

> On Wed, 02 Sep 2009 14:40:09 +0200
> Eric Dumazet <eric.dumazet@gmail.com> wrote:
> 
>> Three bytes of uninitialized kernel memory are currently leaked to user
>> 
>> Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
>> ---
>> diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c
>> index 24d17ce..fdb694e 100644
>> --- a/net/sched/sch_api.c
>> +++ b/net/sched/sch_api.c
>> @@ -1456,6 +1456,8 @@ static int tc_fill_tclass(struct sk_buff *skb, struct Qdisc *q,
>>  	nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*tcm), flags);
>>  	tcm = NLMSG_DATA(nlh);
>>  	tcm->tcm_family = AF_UNSPEC;
>> +	tcm->tcm__pad1 = 0;
>> +	tcm->tcm__pad2 = 0;
>>  	tcm->tcm_ifindex = qdisc_dev(q)->ifindex;
>>  	tcm->tcm_parent = q->handle;
>>  	tcm->tcm_handle = q->handle;
> 
> Perhaps __nlmsg_put should just always call memset() for the whole
> added chunk. It is not like it is critical path in any way, and
> avoid any of this possible class of errors.

Doing it in __nlmsg_put would effect a lot of code paths.  I don't
think you can say with certainty that it won't matter, tree wide.

What about things like the netfilter conntrack event monitor?  Doesn't
that emit hundreds of thousands of events per second on a busy
firewall?
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Miller Sept. 3, 2009, 5:51 a.m. UTC | #4
From: Jiri Pirko <jpirko@redhat.com>
Date: Wed, 2 Sep 2009 20:09:36 +0200

> Wed, Sep 02, 2009 at 02:40:09PM CEST, eric.dumazet@gmail.com wrote:
>>Three bytes of uninitialized kernel memory are currently leaked to user
>>
>>Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
> 
> Reviewed-by: Jiri Pirko <jpirko@redhat.com>

I'll apply this to net-2.6, thanks everyone.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
stephen hemminger Sept. 3, 2009, 6:34 a.m. UTC | #5
On Wed, 02 Sep 2009 22:51:08 -0700 (PDT)
David Miller <davem@davemloft.net> wrote:

> From: Stephen Hemminger <shemminger@vyatta.com>
> Date: Wed, 2 Sep 2009 12:05:40 -0700
> 
> > On Wed, 02 Sep 2009 14:40:09 +0200
> > Eric Dumazet <eric.dumazet@gmail.com> wrote:
> > 
> >> Three bytes of uninitialized kernel memory are currently leaked to user
> >> 
> >> Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
> >> ---
> >> diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c
> >> index 24d17ce..fdb694e 100644
> >> --- a/net/sched/sch_api.c
> >> +++ b/net/sched/sch_api.c
> >> @@ -1456,6 +1456,8 @@ static int tc_fill_tclass(struct sk_buff *skb, struct Qdisc *q,
> >>  	nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*tcm), flags);
> >>  	tcm = NLMSG_DATA(nlh);
> >>  	tcm->tcm_family = AF_UNSPEC;
> >> +	tcm->tcm__pad1 = 0;
> >> +	tcm->tcm__pad2 = 0;
> >>  	tcm->tcm_ifindex = qdisc_dev(q)->ifindex;
> >>  	tcm->tcm_parent = q->handle;
> >>  	tcm->tcm_handle = q->handle;
> > 
> > Perhaps __nlmsg_put should just always call memset() for the whole
> > added chunk. It is not like it is critical path in any way, and
> > avoid any of this possible class of errors.
> 
> Doing it in __nlmsg_put would effect a lot of code paths.  I don't
> think you can say with certainty that it won't matter, tree wide.
> 
> What about things like the netfilter conntrack event monitor?  Doesn't
> that emit hundreds of thousands of events per second on a busy
> firewall?

I doubt it would make a noticeable performance difference because
the first memset would incur the cache penalty of the write (if any)
and later update of fields would be cached.
David Miller Sept. 3, 2009, 6:45 a.m. UTC | #6
From: Stephen Hemminger <shemminger@vyatta.com>
Date: Wed, 2 Sep 2009 23:34:10 -0700

> I doubt it would make a noticeable performance difference because
> the first memset would incur the cache penalty of the write (if any)
> and later update of fields would be cached.

Indeed, but it also means your store buffer usage is half as effective.
And when writing a ton of messages that might be important.

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c
index 24d17ce..fdb694e 100644
--- a/net/sched/sch_api.c
+++ b/net/sched/sch_api.c
@@ -1456,6 +1456,8 @@  static int tc_fill_tclass(struct sk_buff *skb, struct Qdisc *q,
 	nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*tcm), flags);
 	tcm = NLMSG_DATA(nlh);
 	tcm->tcm_family = AF_UNSPEC;
+	tcm->tcm__pad1 = 0;
+	tcm->tcm__pad2 = 0;
 	tcm->tcm_ifindex = qdisc_dev(q)->ifindex;
 	tcm->tcm_parent = q->handle;
 	tcm->tcm_handle = q->handle;