ACK: [Trusty] netlink: Fix dump skb leak/double free

Colin Ian King colin.king at canonical.com
Thu Dec 15 10:52:11 UTC 2016


On 15/12/16 10:49, Luis Henriques wrote:
> From: Herbert Xu <herbert at gondor.apana.org.au>
> 
> When we free cb->skb after a dump, we do it after releasing the
> lock.  This means that a new dump could have started in the time
> being and we'll end up freeing their skb instead of ours.
> 
> This patch saves the skb and module before we unlock so we free
> the right memory.
> 
> Fixes: 16b304f3404f ("netlink: Eliminate kmalloc in netlink dump operation.")
> Reported-by: Baozeng Ding <sploving1 at gmail.com>
> Signed-off-by: Herbert Xu <herbert at gondor.apana.org.au>
> Acked-by: Cong Wang <xiyou.wangcong at gmail.com>
> Signed-off-by: David S. Miller <davem at davemloft.net>
> (cherry picked from commit 92964c79b357efd980812c4de5c1fd2ec8bb5520)
> CVE-2016-9806
> Signed-off-by: Luis Henriques <luis.henriques at canonical.com>
> ---
>  net/netlink/af_netlink.c | 7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
> index f4bc7ddc5840..0038f9bb8a09 100644
> --- a/net/netlink/af_netlink.c
> +++ b/net/netlink/af_netlink.c
> @@ -2663,6 +2663,7 @@ static int netlink_dump(struct sock *sk)
>  	struct netlink_callback *cb;
>  	struct sk_buff *skb = NULL;
>  	struct nlmsghdr *nlh;
> +	struct module *module;
>  	int len, err = -ENOBUFS;
>  	int alloc_size;
>  
> @@ -2732,9 +2733,11 @@ static int netlink_dump(struct sock *sk)
>  		cb->done(cb);
>  
>  	nlk->cb_running = false;
> +	module = cb->module;
> +	skb = cb->skb;
>  	mutex_unlock(nlk->cb_mutex);
> -	module_put(cb->module);
> -	consume_skb(cb->skb);
> +	module_put(module);
> +	consume_skb(skb);
>  	return 0;
>  
>  errout_skb:
> 
Acked-by: Colin Ian King <colin.king at canonical.com>




More information about the kernel-team mailing list