diff mbox

udp_diag: Fix socket skipping within chain

Message ID 20150123210240.GA1569@gondor.apana.org.au
State Accepted, archived
Delegated to: David Miller
Headers show

Commit Message

Herbert Xu Jan. 23, 2015, 9:02 p.m. UTC
While working on rhashtable walking I noticed that the UDP diag
dumping code is buggy.  In particular, the socket skipping within
a chain never happens, even though we record the number of sockets
that should be skipped.

As this code was supposedly copied from TCP, this patch does what
TCP does and resets num before we walk a chain.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

Comments

Pavel Emelyanov Jan. 26, 2015, 11:07 a.m. UTC | #1
On 01/24/2015 12:02 AM, Herbert Xu wrote:
> While working on rhashtable walking I noticed that the UDP diag
> dumping code is buggy.  In particular, the socket skipping within
> a chain never happens, even though we record the number of sockets
> that should be skipped.
> 
> As this code was supposedly copied from TCP, this patch does what
> TCP does and resets num before we walk a chain.
> 
> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

Acked-by: Pavel Emelyanov <xemul@parallels.com>

Thanks,
Pavel

> diff --git a/net/ipv4/udp_diag.c b/net/ipv4/udp_diag.c
> index 7927db0..4a000f1 100644
> --- a/net/ipv4/udp_diag.c
> +++ b/net/ipv4/udp_diag.c
> @@ -99,11 +99,13 @@ static void udp_dump(struct udp_table *table, struct sk_buff *skb, struct netlin
>  	s_slot = cb->args[0];
>  	num = s_num = cb->args[1];
>  
> -	for (slot = s_slot; slot <= table->mask; num = s_num = 0, slot++) {
> +	for (slot = s_slot; slot <= table->mask; s_num = 0, slot++) {
>  		struct sock *sk;
>  		struct hlist_nulls_node *node;
>  		struct udp_hslot *hslot = &table->hash[slot];
>  
> +		num = 0;
> +
>  		if (hlist_nulls_empty(&hslot->head))
>  			continue;
>  
> 

--
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 Jan. 27, 2015, 8:03 a.m. UTC | #2
From: Herbert Xu <herbert@gondor.apana.org.au>
Date: Sat, 24 Jan 2015 08:02:40 +1100

> While working on rhashtable walking I noticed that the UDP diag
> dumping code is buggy.  In particular, the socket skipping within
> a chain never happens, even though we record the number of sockets
> that should be skipped.
> 
> As this code was supposedly copied from TCP, this patch does what
> TCP does and resets num before we walk a chain.
> 
> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

Applied and queued up for -stable, thanks Herbert.
--
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/ipv4/udp_diag.c b/net/ipv4/udp_diag.c
index 7927db0..4a000f1 100644
--- a/net/ipv4/udp_diag.c
+++ b/net/ipv4/udp_diag.c
@@ -99,11 +99,13 @@  static void udp_dump(struct udp_table *table, struct sk_buff *skb, struct netlin
 	s_slot = cb->args[0];
 	num = s_num = cb->args[1];
 
-	for (slot = s_slot; slot <= table->mask; num = s_num = 0, slot++) {
+	for (slot = s_slot; slot <= table->mask; s_num = 0, slot++) {
 		struct sock *sk;
 		struct hlist_nulls_node *node;
 		struct udp_hslot *hslot = &table->hash[slot];
 
+		num = 0;
+
 		if (hlist_nulls_empty(&hslot->head))
 			continue;