netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3]: fixes for multicast routing rules
@ 2010-04-15 12:47 Patrick McHardy
  2010-04-15 12:47 ` [PATCH 1/3] ipv4: ipmr: fix IP_MROUTE_MULTIPLE_TABLES Kconfig dependencies Patrick McHardy
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Patrick McHardy @ 2010-04-15 12:47 UTC (permalink / raw)
  To: davem; +Cc: netdev

Hi Dave,

the following three patches fix a few bugs introduced by the multicast routing
rule patches:

- a missing Kconfig dependency on IP_MROUTE

- a bug introduced by the list conversion, causing the list head to be treated
  as an element

- a NULL pointer dereference: the net pointer in ipmr_destroy_unres() was
  initialized to NULL. This patch was actually intended to be folded into
  the patch introducing multicast routing rules, but I missed it when
  rebasing to the current tree.

Please apply or pull from:

git://git.kernel.org/pub/scm/linux/kernel/git/kaber/ipmr-2.6.git master

Thanks!

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/3] ipv4: ipmr: fix IP_MROUTE_MULTIPLE_TABLES Kconfig dependencies
  2010-04-15 12:47 [PATCH 0/3]: fixes for multicast routing rules Patrick McHardy
@ 2010-04-15 12:47 ` Patrick McHardy
  2010-04-15 12:47 ` [PATCH 2/3] ipv4: ipmr: fix invalid cache resolving when adding a non-matching entry Patrick McHardy
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Patrick McHardy @ 2010-04-15 12:47 UTC (permalink / raw)
  To: davem; +Cc: netdev

IP_MROUTE_MULTIPLE_TABLES should depend on IP_MROUTE.

Signed-off-by: Patrick McHardy <kaber@trash.net>
---
 net/ipv4/Kconfig |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/net/ipv4/Kconfig b/net/ipv4/Kconfig
index be59774..8e3a1fd 100644
--- a/net/ipv4/Kconfig
+++ b/net/ipv4/Kconfig
@@ -252,7 +252,7 @@ config IP_MROUTE
 
 config IP_MROUTE_MULTIPLE_TABLES
 	bool "IP: multicast policy routing"
-	depends on IP_ADVANCED_ROUTER
+	depends on IP_MROUTE && IP_ADVANCED_ROUTER
 	select FIB_RULES
 	help
 	  Normally, a multicast router runs a userspace daemon and decides
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 2/3] ipv4: ipmr: fix invalid cache resolving when adding a non-matching entry
  2010-04-15 12:47 [PATCH 0/3]: fixes for multicast routing rules Patrick McHardy
  2010-04-15 12:47 ` [PATCH 1/3] ipv4: ipmr: fix IP_MROUTE_MULTIPLE_TABLES Kconfig dependencies Patrick McHardy
@ 2010-04-15 12:47 ` Patrick McHardy
  2010-04-15 12:47 ` [PATCH 3/3] ipv4: ipmr: fix NULL pointer deref during unres queue destruction Patrick McHardy
  2010-04-15 21:14 ` [PATCH 0/3]: fixes for multicast routing rules David Miller
  3 siblings, 0 replies; 5+ messages in thread
From: Patrick McHardy @ 2010-04-15 12:47 UTC (permalink / raw)
  To: davem; +Cc: netdev

The patch to convert struct mfc_cache to list_heads (ipv4: ipmr: convert
struct mfc_cache to struct list_head) introduced a bug when adding new
cache entries that don't match any unresolved entries.

The unres queue is searched for a matching entry, which is then resolved.
When no matching entry is present, the iterator points to the head of the
list, but is treated as a matching entry. Use a seperate variable to
indicate that a matching entry was found.

Signed-off-by: Patrick McHardy <kaber@trash.net>
---
 net/ipv4/ipmr.c |    4 +++-
 1 files changed, 3 insertions(+), 1 deletions(-)

diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c
index 5df5fd7..0643fb6 100644
--- a/net/ipv4/ipmr.c
+++ b/net/ipv4/ipmr.c
@@ -1089,12 +1089,14 @@ static int ipmr_mfc_add(struct net *net, struct mr_table *mrt,
 	 *	Check to see if we resolved a queued list. If so we
 	 *	need to send on the frames and tidy up.
 	 */
+	found = false;
 	spin_lock_bh(&mfc_unres_lock);
 	list_for_each_entry(uc, &mrt->mfc_unres_queue, list) {
 		if (uc->mfc_origin == c->mfc_origin &&
 		    uc->mfc_mcastgrp == c->mfc_mcastgrp) {
 			list_del(&uc->list);
 			atomic_dec(&mrt->cache_resolve_queue_len);
+			found = true;
 			break;
 		}
 	}
@@ -1102,7 +1104,7 @@ static int ipmr_mfc_add(struct net *net, struct mr_table *mrt,
 		del_timer(&mrt->ipmr_expire_timer);
 	spin_unlock_bh(&mfc_unres_lock);
 
-	if (uc) {
+	if (found) {
 		ipmr_cache_resolve(net, mrt, uc, c);
 		ipmr_cache_free(uc);
 	}
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 3/3] ipv4: ipmr: fix NULL pointer deref during unres queue destruction
  2010-04-15 12:47 [PATCH 0/3]: fixes for multicast routing rules Patrick McHardy
  2010-04-15 12:47 ` [PATCH 1/3] ipv4: ipmr: fix IP_MROUTE_MULTIPLE_TABLES Kconfig dependencies Patrick McHardy
  2010-04-15 12:47 ` [PATCH 2/3] ipv4: ipmr: fix invalid cache resolving when adding a non-matching entry Patrick McHardy
@ 2010-04-15 12:47 ` Patrick McHardy
  2010-04-15 21:14 ` [PATCH 0/3]: fixes for multicast routing rules David Miller
  3 siblings, 0 replies; 5+ messages in thread
From: Patrick McHardy @ 2010-04-15 12:47 UTC (permalink / raw)
  To: davem; +Cc: netdev

Fix an oversight in ipmr_destroy_unres() - the net pointer is
unconditionally initialized to NULL, resulting in a NULL pointer
dereference later on.

Fix by adding a net pointer to struct mr_table and using it in
ipmr_destroy_unres().

Signed-off-by: Patrick McHardy <kaber@trash.net>
---
 net/ipv4/ipmr.c |    6 +++++-
 1 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c
index 0643fb6..7d8a2bc 100644
--- a/net/ipv4/ipmr.c
+++ b/net/ipv4/ipmr.c
@@ -71,6 +71,9 @@
 
 struct mr_table {
 	struct list_head	list;
+#ifdef CONFIG_NET_NS
+	struct net		*net;
+#endif
 	u32			id;
 	struct sock		*mroute_sk;
 	struct timer_list	ipmr_expire_timer;
@@ -308,6 +311,7 @@ static struct mr_table *ipmr_new_table(struct net *net, u32 id)
 	mrt = kzalloc(sizeof(*mrt), GFP_KERNEL);
 	if (mrt == NULL)
 		return NULL;
+	write_pnet(&mrt->net, net);
 	mrt->id = id;
 
 	/* Forwarding cache */
@@ -580,7 +584,7 @@ static inline void ipmr_cache_free(struct mfc_cache *c)
 
 static void ipmr_destroy_unres(struct mr_table *mrt, struct mfc_cache *c)
 {
-	struct net *net = NULL; //mrt->net;
+	struct net *net = read_pnet(&mrt->net);
 	struct sk_buff *skb;
 	struct nlmsgerr *e;
 
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH 0/3]: fixes for multicast routing rules
  2010-04-15 12:47 [PATCH 0/3]: fixes for multicast routing rules Patrick McHardy
                   ` (2 preceding siblings ...)
  2010-04-15 12:47 ` [PATCH 3/3] ipv4: ipmr: fix NULL pointer deref during unres queue destruction Patrick McHardy
@ 2010-04-15 21:14 ` David Miller
  3 siblings, 0 replies; 5+ messages in thread
From: David Miller @ 2010-04-15 21:14 UTC (permalink / raw)
  To: kaber; +Cc: netdev

From: Patrick McHardy <kaber@trash.net>
Date: Thu, 15 Apr 2010 14:47:55 +0200

> the following three patches fix a few bugs introduced by the multicast routing
> rule patches:
 ...
> Please apply or pull from:
> 
> git://git.kernel.org/pub/scm/linux/kernel/git/kaber/ipmr-2.6.git master

Pulled, thanks a lot Patrick!

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2010-04-15 21:14 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-04-15 12:47 [PATCH 0/3]: fixes for multicast routing rules Patrick McHardy
2010-04-15 12:47 ` [PATCH 1/3] ipv4: ipmr: fix IP_MROUTE_MULTIPLE_TABLES Kconfig dependencies Patrick McHardy
2010-04-15 12:47 ` [PATCH 2/3] ipv4: ipmr: fix invalid cache resolving when adding a non-matching entry Patrick McHardy
2010-04-15 12:47 ` [PATCH 3/3] ipv4: ipmr: fix NULL pointer deref during unres queue destruction Patrick McHardy
2010-04-15 21:14 ` [PATCH 0/3]: fixes for multicast routing rules David Miller

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).