netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: [BK PATCH 2.6] repost, fix sysctl breakage during network device renaming, for ipv4
  2003-09-01 16:46 [BK PATCH 2.6] repost, fix sysctl breakage during network device renaming, for ipv4 Dan Aloni
@ 2003-09-01 16:41 ` David S. Miller
  2003-09-01 16:55   ` Dan Aloni
  0 siblings, 1 reply; 9+ messages in thread
From: David S. Miller @ 2003-09-01 16:41 UTC (permalink / raw)
  To: Dan Aloni; +Cc: netdev

On Mon, 1 Sep 2003 19:46:24 +0300
Dan Aloni <da-x@gmx.net> wrote:

> Can you please take a look and comment?

I commented already and I said "putting a private copy
of a generic function like strdup() in the middle of
the networking code is inappropriate."

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

* [BK PATCH 2.6] repost, fix sysctl breakage during network device renaming, for ipv4
@ 2003-09-01 16:46 Dan Aloni
  2003-09-01 16:41 ` David S. Miller
  0 siblings, 1 reply; 9+ messages in thread
From: Dan Aloni @ 2003-09-01 16:46 UTC (permalink / raw)
  To: netdev; +Cc: David S. Miller

Can you please take a look and comment?

You can import this changeset into BK by piping this whole message to:
'| bk receive [path to repository]' or apply the patch as usual.

===================================================================


ChangeSet@1.1292, 2003-08-26 18:30:17+03:00, da-x@gmx.net
  Sysctl assumes its ctl_table.procname field is const, but the 
  networking points ctl_table.procname to dev->name. When renaming 
  a network device using SIOCSIFNAME, dev->name is modified and 
  sysctl's assumption breaks, causing this behaviour, at least:
  
    1. sysctl wouldn't be able to remove the proc entry when the 
       device requests to be unregistered, because it would be 
       using the new name instead of the old one.
    2. proc entries for devices remain with the old name after 
       rename.
    
  This change includes allocating the current device name to a
  new copy upon registering with sysctl, plus re-registering with 
  sysctl when the device is renamed.
  
  This only fixes IPv4.
  Fixes for ax25, core/neighbour.c, decnet, and ipv6 are also planned.
  


 devinet.c |   45 ++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 40 insertions(+), 5 deletions(-)


diff -Nru a/net/ipv4/devinet.c b/net/ipv4/devinet.c
--- a/net/ipv4/devinet.c	Tue Aug 26 18:31:08 2003
+++ b/net/ipv4/devinet.c	Tue Aug 26 18:31:08 2003
@@ -904,6 +904,11 @@
 		 * not interesting to applications using netlink.
 		 */
 		inetdev_changename(dev, in_dev);
+
+#ifdef CONFIG_SYSCTL
+		devinet_sysctl_unregister(&in_dev->cnf);
+		devinet_sysctl_register(in_dev, &in_dev->cnf);
+#endif
 		break;
 	}
 out:
@@ -1295,12 +1300,21 @@
 	},
 };
 
+static char *strdup(char *s)
+{
+	char *rv = kmalloc(strlen(s)+1, GFP_KERNEL);
+	if (rv)
+		strcpy(rv, s);
+	return rv;
+}
+
 static void devinet_sysctl_register(struct in_device *in_dev,
 				    struct ipv4_devconf *p)
 {
 	int i;
 	struct net_device *dev = in_dev ? in_dev->dev : NULL;
 	struct devinet_sysctl_table *t = kmalloc(sizeof(*t), GFP_KERNEL);
+	char *dev_name = NULL;
 
 	if (!t)
 		return;
@@ -1309,13 +1323,25 @@
 		t->devinet_vars[i].data += (char *)p - (char *)&ipv4_devconf;
 		t->devinet_vars[i].de = NULL;
 	}
+
 	if (dev) {
-		t->devinet_dev[0].procname = dev->name;
+		dev_name = dev->name; 
 		t->devinet_dev[0].ctl_name = dev->ifindex;
 	} else {
-		t->devinet_dev[0].procname = "default";
+		dev_name = "default";
 		t->devinet_dev[0].ctl_name = NET_PROTO_CONF_DEFAULT;
 	}
+
+	/* 
+	 * Make a copy of dev_name, because '.procname' is regarded as const 
+	 * by sysctl and we wouldn't want anyone to change it under our feet
+	 * (see SIOCSIFNAME).
+	 */	
+	dev_name = strdup(dev_name);
+	if (!dev_name)
+	    goto free;
+
+	t->devinet_dev[0].procname    = dev_name;
 	t->devinet_dev[0].child	      = t->devinet_vars;
 	t->devinet_dev[0].de	      = NULL;
 	t->devinet_conf_dir[0].child  = t->devinet_dev;
@@ -1327,9 +1353,17 @@
 
 	t->sysctl_header = register_sysctl_table(t->devinet_root_dir, 0);
 	if (!t->sysctl_header)
-		kfree(t);
-	else
-		p->sysctl = t;
+	    goto free_procname;
+
+	p->sysctl = t;
+	return;
+
+	/* error path */
+ free_procname:
+	kfree(dev_name);
+ free:
+	kfree(t);
+	return;
 }
 
 static void devinet_sysctl_unregister(struct ipv4_devconf *p)
@@ -1338,6 +1372,7 @@
 		struct devinet_sysctl_table *t = p->sysctl;
 		p->sysctl = NULL;
 		unregister_sysctl_table(t->sysctl_header);
+		kfree(t->devinet_dev[0].procname);
 		kfree(t);
 	}
 }

===================================================================


This BitKeeper patch contains the following changesets:
+
## Wrapped with gzip_uu ##


M'XL( #Q]2S\  [56^V_;-A#^V?PK;@VP/&K+>EB*;,-!NC3IC*9)D+08AK8P
M:(FV5<ND1U)VC'G_^XYZV>ECQ8I--FR1O#M^W]WIHP[@G6*RUXAIZY$<P*]"
MZ5YCNGBT.-,XOA<"Q^V96+!V3!_;<R8Y2]MIPK/'EFL%K;60<X*&=U1',U@Q
MJ7H-Q_+J&;U9LE[C_O+5N^L7]X0,!G QHWS*'IB&P8!H(5<TC=4YU;-4<$M+
MRM6":6I%8K&M3;>N;;OX\9U3S_:#K1/8G=-MY,2.0SL.BVVW$P8=LDHXW;1D
M=,ZISB138J(-C_?5+A^?1O3LT/4<U_5<;^L'OA^0E^!8CMMUP?;:=MAV W#"
MGF?WG-/GMM>S;3!I.B_3 \\=:-GD%_AO25R0"!XV*M(I4*6R!5.0: 4X'FDZ
M3IFUE"+B=,%@DK TA@37!%>Z">-,@YXQP  (SU0FX5-8BH1_W5\+B-FJ=68&
M%OPV8QPDPX'QPABTBF*LDHA!ILS*P_#VXF%X=?/BS65SYV]@+$2<(*88*(]-
M )6S.%0%CZ5.!(>Q9'2NFA#1(IJ>H>.8S>@J$9EL M60,HI-B/[X!2Q(&0?6
M(DMC?JC1' P1@U^RA5BQG+6A!8QKN8&UH5)F(K]* I+]D3&%R4!/#))QR::)
MTDRR&+/'#"8DHHN=C$7E7V%EF)(U%'PQY8S&(";YO$ 'P9F5>[C6#DV"]9L(
M64)0!C%-.*P3/:L=\X!T@D#J'?-"E.'PYZU)4Y1W$NX<I5F,H6B:BHCJ"EJ4
M2?32%=FJQ#1OAS4VR7(#V5*8(A>LC6..HTAP$Y9I9@"VOC"HB[E+;;E+HDJH
ML554+$<J>+K!]GQ$D,.[5<<L7>4CDPGZZ/K8 $*R-F?)=#;&PEN1Z:4(&ZZ9
M=T^R7 5 )68E50)Q4<[+'5Z#[W>['7*W$Q+2^I<7(3:UR=EW'EP$TT8<G;:A
MB@,KVG^"NWZX]9S0<;=A3">.'5.G,PG=;CQ^(A+?B&*D)W!\S[:[6S?PPDXN
MC5_:?E\C?Q0E^42Y)21=L>@\P$"6FG\;JX._G< _W7;PQL]ETG4^%TF[^U61
M[-C0\O\7E;S?=>I^'_]3CYH.O4,Y0G'+GX?RZ<V?E74A@'7K6]AK16UNH277
M^1=[Y^XK9?J!#AQV[0!\\H$<)).83>#B]N9J^&KT\/O#Q=MKTFB4L4<%I]%.
MJXY^3O@HU]V(3X[[7YK6AH5=$SYS.& <=9H,\: [A9 HC1(2&7&1<**TC+/E
M43DX)G^21G$O5S" ^2*7G".T2AD_4L?/G2:\NKH;O;Z\O[F\-F"2"1S)U3&B
M0J-HN<%!$Y19D0S/9$SPJD_^0MI#Q[,]<*KXB&^45V$ -^^NK_MFW7%P_0-Y
MB7?&<EC^YX0KX_H ZD-N&)2&P>>&SS#)-$OULR)T"(Z)W6B? &G ";RA<[;7
M%)7C[E@XK,_-PZ*AIE3&YJPKC]\BS'A3-:%1L37;'5IKBM),^08/":/*E99K
M/(5B[%_40)@PU#(3Y4@QMG_.'EMFNMT@^X3*4E4S5?)_JB?0!Z^IP-TFDK&^
MH:M;9U6WX/][^^/N;0"O0<V[;Y+IV>"99'FN2=;3:*/*+P^[;)V5M >@ZUKW
MRP0S*5'VE_C<(PGRU+U'&G,SL<\CMZ@7]/%>0$2#>F)*6RY^DP]ZU2^AT8Q%
5<WP%&5 6GG;&;DC^!H[ZU[+W"@  
 


-- 
Dan Aloni
da-x@gmx.net

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

* Re: [BK PATCH 2.6] repost, fix sysctl breakage during network device renaming, for ipv4
  2003-09-01 16:41 ` David S. Miller
@ 2003-09-01 16:55   ` Dan Aloni
  2003-09-01 18:31     ` David S. Miller
  0 siblings, 1 reply; 9+ messages in thread
From: Dan Aloni @ 2003-09-01 16:55 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev

On Mon, Sep 01, 2003 at 09:41:27AM -0700, David S. Miller wrote:
> On Mon, 1 Sep 2003 19:46:24 +0300
> Dan Aloni <da-x@gmx.net> wrote:
> 
> > Can you please take a look and comment?
> 
> I commented already and I said "putting a private copy
> of a generic function like strdup() in the middle of
> the networking code is inappropriate."

For some unknown reason I didn't get that response.

The private copy of strdup() is something that I'd also wouldn't
want, but I don't have much choice. Please read a recent 
thread in lkml regarding strdup() consolidation.

-- 
Dan Aloni
da-x@gmx.net

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

* Re: [BK PATCH 2.6] repost, fix sysctl breakage during network device renaming, for ipv4
  2003-09-01 16:55   ` Dan Aloni
@ 2003-09-01 18:31     ` David S. Miller
  2003-09-01 18:55       ` Dan Aloni
  2003-10-17 21:32       ` Dan Aloni
  0 siblings, 2 replies; 9+ messages in thread
From: David S. Miller @ 2003-09-01 18:31 UTC (permalink / raw)
  To: Dan Aloni; +Cc: netdev

On Mon, 1 Sep 2003 19:55:59 +0300
Dan Aloni <da-x@gmx.net> wrote:

> The private copy of strdup() is something that I'd also wouldn't
> want, but I don't have much choice. Please read a recent 
> thread in lkml regarding strdup() consolidation.

Ugh, I'm afraid to look...  I guess the controversy is
over the allocation function, what GFP_* flags it should
use etc.?

For now just call the thing in your patch netdev_name_dup() or
something like that.  I can't handle having something named
"strdup()" in there :-)

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

* Re: [BK PATCH 2.6] repost, fix sysctl breakage during network device renaming, for ipv4
  2003-09-01 18:31     ` David S. Miller
@ 2003-09-01 18:55       ` Dan Aloni
  2003-10-17 21:32       ` Dan Aloni
  1 sibling, 0 replies; 9+ messages in thread
From: Dan Aloni @ 2003-09-01 18:55 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev

On Mon, Sep 01, 2003 at 11:31:43AM -0700, David S. Miller wrote:
> On Mon, 1 Sep 2003 19:55:59 +0300
> Dan Aloni <da-x@gmx.net> wrote:
> 
> > The private copy of strdup() is something that I'd also wouldn't
> > want, but I don't have much choice. Please read a recent 
> > thread in lkml regarding strdup() consolidation.
> 
> Ugh, I'm afraid to look...  I guess the controversy is
> over the allocation function, what GFP_* flags it should
> use etc.?

Yes, this is the one reason against consolidation, though
I don't know why anyone would want to call strdup() from a 
context other than GPF_KERNEL. Copying strings around in the 
kernel is done as a result of userspace interaction.
 
> For now just call the thing in your patch netdev_name_dup() or
> something like that.  I can't handle having something named
> "strdup()" in there :-)

Sure, I'll do it and resend.

-- 
Dan Aloni
da-x@gmx.net

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

* Re: [BK PATCH 2.6] repost, fix sysctl breakage during network device renaming, for ipv4
  2003-09-01 18:31     ` David S. Miller
  2003-09-01 18:55       ` Dan Aloni
@ 2003-10-17 21:32       ` Dan Aloni
  2003-10-18  7:01         ` David S. Miller
  1 sibling, 1 reply; 9+ messages in thread
From: Dan Aloni @ 2003-10-17 21:32 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev

On Mon, Sep 01, 2003 at 11:31:43AM -0700, David S. Miller wrote:
> On Mon, 1 Sep 2003 19:55:59 +0300
> Dan Aloni <da-x@gmx.net> wrote:
> 
> > The private copy of strdup() is something that I'd also wouldn't
> > want, but I don't have much choice. Please read a recent 
> > thread in lkml regarding strdup() consolidation.
> 
> Ugh, I'm afraid to look...  I guess the controversy is
> over the allocation function, what GFP_* flags it should
> use etc.?
> 
> For now just call the thing in your patch netdev_name_dup() or
> something like that.  I can't handle having something named
> "strdup()" in there :-)

Here is the patch. I've compiled and tested it.


You can import this changeset into BK by piping this whole message to:
'| bk receive [path to repository]' or apply the patch as usual.

===================================================================


ChangeSet@1.1292, 2003-10-17 22:39:48+02:00, da-x@gmx.net
  Sysctl assumes its ctl_table.procname field is const, but the 
  networking points ctl_table.procname to dev->name. When renaming 
  a network device using SIOCSIFNAME, dev->name is modified and 
  sysctl's assumption breaks, causing this behaviour, at least:
  
    1. sysctl wouldn't be able to remove the proc entry when the 
       device requests to be unregistered, because it would be 
       using the new name instead of the old one.
    2. proc entries for devices remain with the old name after 
       rename.
    
  This change includes allocating the current device name to a
  new copy upon registering with sysctl, plus re-registering with 
  sysctl when the device is renamed.
  
  This only fixes IPv4, IPv6, and net/core/neightbour.c.
  Fixes for ax25 and decnet are also planned.


 include/linux/netdevice.h  |    3 +++
 net/core/neighbour.c       |   29 ++++++++++++++++++++++++++---
 net/core/sysctl_net_core.c |   13 +++++++++++++
 net/ipv4/devinet.c         |   40 +++++++++++++++++++++++++++++++++++-----
 net/ipv6/addrconf.c        |   37 ++++++++++++++++++++++++++++++++++---
 5 files changed, 111 insertions(+), 11 deletions(-)


diff -Nru a/include/linux/netdevice.h b/include/linux/netdevice.h
--- a/include/linux/netdevice.h	Fri Oct 17 22:40:18 2003
+++ b/include/linux/netdevice.h	Fri Oct 17 22:40:18 2003
@@ -869,6 +869,9 @@
 extern void		dev_clear_fastroute(struct net_device *dev);
 #endif
 
+#ifdef CONFIG_SYSCTL
+extern char *net_sysctl_strdup(const char *s);
+#endif
 
 #endif /* __KERNEL__ */
 
diff -Nru a/net/core/neighbour.c b/net/core/neighbour.c
--- a/net/core/neighbour.c	Fri Oct 17 22:40:18 2003
+++ b/net/core/neighbour.c	Fri Oct 17 22:40:18 2003
@@ -1627,6 +1627,9 @@
 			  int p_id, int pdev_id, char *p_name)
 {
 	struct neigh_sysctl_table *t = kmalloc(sizeof(*t), GFP_KERNEL);
+	const char *dev_name_source = NULL;
+	char *dev_name = NULL;
+	int err = 0;
 
 	if (!t)
 		return -ENOBUFS;
@@ -1643,8 +1646,10 @@
 	t->neigh_vars[9].data  = &p->anycast_delay;
 	t->neigh_vars[10].data = &p->proxy_delay;
 	t->neigh_vars[11].data = &p->locktime;
+
+ 	dev_name_source = t->neigh_dev[0].procname;
 	if (dev) {
-		t->neigh_dev[0].procname = dev->name;
+		dev_name_source = dev->name;
 		t->neigh_dev[0].ctl_name = dev->ifindex;
 		memset(&t->neigh_vars[12], 0, sizeof(ctl_table));
 	} else {
@@ -1653,6 +1658,15 @@
 		t->neigh_vars[14].data = (int *)(p + 1) + 2;
 		t->neigh_vars[15].data = (int *)(p + 1) + 3;
 	}
+
+	dev_name = net_sysctl_strdup(dev_name_source);
+	if (!dev_name) {
+		err = -ENOBUFS;
+		goto free;
+	}
+
+ 	t->neigh_dev[0].procname = dev_name;
+
 	t->neigh_neigh_dir[0].ctl_name = pdev_id;
 
 	t->neigh_proto_dir[0].procname = p_name;
@@ -1665,11 +1679,19 @@
 
 	t->sysctl_header = register_sysctl_table(t->neigh_root_dir, 0);
 	if (!t->sysctl_header) {
-		kfree(t);
-		return -ENOBUFS;
+		err = -ENOBUFS;
+		goto free_procname;
 	}
 	p->sysctl_table = t;
 	return 0;
+
+	/* error path */
+ free_procname:
+	kfree(dev_name);
+ free:
+	kfree(t);
+
+	return err;
 }
 
 void neigh_sysctl_unregister(struct neigh_parms *p)
@@ -1678,6 +1700,7 @@
 		struct neigh_sysctl_table *t = p->sysctl_table;
 		p->sysctl_table = NULL;
 		unregister_sysctl_table(t->sysctl_header);
+		kfree(t->neigh_dev[0].procname);
 		kfree(t);
 	}
 }
diff -Nru a/net/core/sysctl_net_core.c b/net/core/sysctl_net_core.c
--- a/net/core/sysctl_net_core.c	Fri Oct 17 22:40:18 2003
+++ b/net/core/sysctl_net_core.c	Fri Oct 17 22:40:18 2003
@@ -33,6 +33,19 @@
 extern char sysctl_divert_version[];
 #endif /* CONFIG_NET_DIVERT */
 
+/*
+ * This strdup() is used for creating copies of network 
+ * device names to be handed over to sysctl.
+ */
+ 
+char *net_sysctl_strdup(const char *s)
+{
+	char *rv = kmalloc(strlen(s)+1, GFP_KERNEL);
+	if (rv)
+		strcpy(rv, s);
+	return rv;
+}
+
 ctl_table core_table[] = {
 #ifdef CONFIG_NET
 	{
diff -Nru a/net/ipv4/devinet.c b/net/ipv4/devinet.c
--- a/net/ipv4/devinet.c	Fri Oct 17 22:40:18 2003
+++ b/net/ipv4/devinet.c	Fri Oct 17 22:40:18 2003
@@ -904,6 +904,14 @@
 		 * not interesting to applications using netlink.
 		 */
 		inetdev_changename(dev, in_dev);
+
+#ifdef CONFIG_SYSCTL
+		devinet_sysctl_unregister(&in_dev->cnf);
+		neigh_sysctl_unregister(in_dev->arp_parms);
+		neigh_sysctl_register(dev, in_dev->arp_parms, NET_IPV4,
+				      NET_IPV4_NEIGH, "ipv4");
+		devinet_sysctl_register(in_dev, &in_dev->cnf);
+#endif
 		break;
 	}
 out:
@@ -1301,6 +1309,7 @@
 	int i;
 	struct net_device *dev = in_dev ? in_dev->dev : NULL;
 	struct devinet_sysctl_table *t = kmalloc(sizeof(*t), GFP_KERNEL);
+	char *dev_name = NULL;
 
 	if (!t)
 		return;
@@ -1309,13 +1318,25 @@
 		t->devinet_vars[i].data += (char *)p - (char *)&ipv4_devconf;
 		t->devinet_vars[i].de = NULL;
 	}
+
 	if (dev) {
-		t->devinet_dev[0].procname = dev->name;
+		dev_name = dev->name; 
 		t->devinet_dev[0].ctl_name = dev->ifindex;
 	} else {
-		t->devinet_dev[0].procname = "default";
+		dev_name = "default";
 		t->devinet_dev[0].ctl_name = NET_PROTO_CONF_DEFAULT;
 	}
+
+	/* 
+	 * Make a copy of dev_name, because '.procname' is regarded as const 
+	 * by sysctl and we wouldn't want anyone to change it under our feet
+	 * (see SIOCSIFNAME).
+	 */	
+	dev_name = net_sysctl_strdup(dev_name);
+	if (!dev_name)
+	    goto free;
+
+	t->devinet_dev[0].procname    = dev_name;
 	t->devinet_dev[0].child	      = t->devinet_vars;
 	t->devinet_dev[0].de	      = NULL;
 	t->devinet_conf_dir[0].child  = t->devinet_dev;
@@ -1327,9 +1348,17 @@
 
 	t->sysctl_header = register_sysctl_table(t->devinet_root_dir, 0);
 	if (!t->sysctl_header)
-		kfree(t);
-	else
-		p->sysctl = t;
+	    goto free_procname;
+
+	p->sysctl = t;
+	return;
+
+	/* error path */
+ free_procname:
+	kfree(dev_name);
+ free:
+	kfree(t);
+	return;
 }
 
 static void devinet_sysctl_unregister(struct ipv4_devconf *p)
@@ -1338,6 +1367,7 @@
 		struct devinet_sysctl_table *t = p->sysctl;
 		p->sysctl = NULL;
 		unregister_sysctl_table(t->sysctl_header);
+		kfree(t->devinet_dev[0].procname);
 		kfree(t);
 	}
 }
diff -Nru a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
--- a/net/ipv6/addrconf.c	Fri Oct 17 22:40:18 2003
+++ b/net/ipv6/addrconf.c	Fri Oct 17 22:40:18 2003
@@ -1875,6 +1875,14 @@
 		break;
 	case NETDEV_CHANGE:
 		break;
+	case NETDEV_CHANGENAME:
+#ifdef CONFIG_SYSCTL
+		addrconf_sysctl_unregister(&idev->cnf);
+		neigh_sysctl_unregister(idev->nd_parms);
+		neigh_sysctl_register(dev, idev->nd_parms, NET_IPV6, NET_IPV6_NEIGH, "ipv6");
+		addrconf_sysctl_register(idev, &idev->cnf);
+#endif
+		break;
 	};
 
 	return NOTIFY_OK;
@@ -2815,6 +2823,7 @@
 	int i;
 	struct net_device *dev = idev ? idev->dev : NULL;
 	struct addrconf_sysctl_table *t;
+	char *dev_name = NULL;
 
 	t = kmalloc(sizeof(*t), GFP_KERNEL);
 	if (t == NULL)
@@ -2826,12 +2835,24 @@
 		t->addrconf_vars[i].extra1 = idev; /* embedded; no ref */
 	}
 	if (dev) {
-		t->addrconf_dev[0].procname = dev->name;
+		dev_name = dev->name; 
 		t->addrconf_dev[0].ctl_name = dev->ifindex;
 	} else {
-		t->addrconf_dev[0].procname = "default";
+		dev_name = "default";
 		t->addrconf_dev[0].ctl_name = NET_PROTO_CONF_DEFAULT;
 	}
+
+	/* 
+	 * Make a copy of dev_name, because '.procname' is regarded as const 
+	 * by sysctl and we wouldn't want anyone to change it under our feet
+	 * (see SIOCSIFNAME).
+	 */	
+	dev_name = net_sysctl_strdup(dev_name);
+	if (!dev_name)
+	    goto free;
+
+	t->addrconf_dev[0].procname = dev_name;
+
 	t->addrconf_dev[0].child = t->addrconf_vars;
 	t->addrconf_dev[0].de = NULL;
 	t->addrconf_conf_dir[0].child = t->addrconf_dev;
@@ -2843,9 +2864,18 @@
 
 	t->sysctl_header = register_sysctl_table(t->addrconf_root_dir, 0);
 	if (t->sysctl_header == NULL)
-		kfree(t);
+		goto free_procname;
 	else
 		p->sysctl = t;
+	return;
+
+	/* error path */
+ free_procname:
+	kfree(dev_name);
+ free:
+	kfree(t);
+
+	return;
 }
 
 static void addrconf_sysctl_unregister(struct ipv6_devconf *p)
@@ -2854,6 +2884,7 @@
 		struct addrconf_sysctl_table *t = p->sysctl;
 		p->sysctl = NULL;
 		unregister_sysctl_table(t->sysctl_header);
+		kfree(t->addrconf_dev[0].procname);
 		kfree(t);
 	}
 }

===================================================================


This BitKeeper patch contains the following changesets:
+
## Wrapped with gzip_uu ##


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
@[S8?%/E6_S<7]GDXR">C(]P+P\"CU/POI)7C0PX<    
 


-- 
Dan Aloni
da-x@gmx.net

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

* Re: [BK PATCH 2.6] repost, fix sysctl breakage during network device renaming, for ipv4
  2003-10-17 21:32       ` Dan Aloni
@ 2003-10-18  7:01         ` David S. Miller
  2003-10-18 11:20           ` Dan Aloni
  0 siblings, 1 reply; 9+ messages in thread
From: David S. Miller @ 2003-10-18  7:01 UTC (permalink / raw)
  To: Dan Aloni; +Cc: netdev

On Fri, 17 Oct 2003 23:32:35 +0200
Dan Aloni <da-x@gmx.net> wrote:

> Here is the patch. I've compiled and tested it.

But not with ipv6 modular :-)  Please add the necessary
module symbol export for net_sysctl_strdup() and resubmit
the patch.

Thank you.

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

* Re: [BK PATCH 2.6] repost, fix sysctl breakage during network device renaming, for ipv4
  2003-10-18  7:01         ` David S. Miller
@ 2003-10-18 11:20           ` Dan Aloni
  2003-10-21  5:57             ` David S. Miller
  0 siblings, 1 reply; 9+ messages in thread
From: Dan Aloni @ 2003-10-18 11:20 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev

On Sat, Oct 18, 2003 at 12:01:31AM -0700, David S. Miller wrote:
> On Fri, 17 Oct 2003 23:32:35 +0200
> Dan Aloni <da-x@gmx.net> wrote:
> 
> > Here is the patch. I've compiled and tested it.
> 
> But not with ipv6 modular :-)  Please add the necessary
> module symbol export for net_sysctl_strdup() and resubmit
> the patch.

Of course, what was I thinking.


You can import this changeset into BK by piping this whole message to:
'| bk receive [path to repository]' or apply the patch as usual.

===================================================================


ChangeSet@1.1365, 2003-10-18 13:08:35+02:00, da-x@gmx.net
  Sysctl assumes its ctl_table.procname field is const, but the 
  networking points ctl_table.procname to dev->name. When renaming 
  a network device using SIOCSIFNAME, dev->name is modified and 
  sysctl's assumption breaks, causing this behaviour, at least:
  
    1. sysctl wouldn't be able to remove the proc entry when the 
       device requests to be unregistered, because it would be 
       using the new name instead of the old one.
    2. proc entries for devices remain with the old name after 
       rename.
    
  This change includes allocating the current device name to a
  new copy upon registering with sysctl, plus re-registering with 
  sysctl when the device is renamed.
  
  This only fixes IPv4, IPv6, and net/core/neightbour.c.
  Fixes for ax25 and decnet are also planned.


 include/linux/netdevice.h  |    3 +++
 net/core/neighbour.c       |   29 ++++++++++++++++++++++++++---
 net/core/sysctl_net_core.c |   16 ++++++++++++++++
 net/ipv4/devinet.c         |   40 +++++++++++++++++++++++++++++++++++-----
 net/ipv6/addrconf.c        |   37 ++++++++++++++++++++++++++++++++++---
 5 files changed, 114 insertions(+), 11 deletions(-)


diff -Nru a/include/linux/netdevice.h b/include/linux/netdevice.h
--- a/include/linux/netdevice.h	Sat Oct 18 13:16:14 2003
+++ b/include/linux/netdevice.h	Sat Oct 18 13:16:14 2003
@@ -901,6 +901,9 @@
 extern void		dev_clear_fastroute(struct net_device *dev);
 #endif
 
+#ifdef CONFIG_SYSCTL
+extern char *net_sysctl_strdup(const char *s);
+#endif
 
 #endif /* __KERNEL__ */
 
diff -Nru a/net/core/neighbour.c b/net/core/neighbour.c
--- a/net/core/neighbour.c	Sat Oct 18 13:16:14 2003
+++ b/net/core/neighbour.c	Sat Oct 18 13:16:14 2003
@@ -1628,6 +1628,9 @@
 			  int p_id, int pdev_id, char *p_name)
 {
 	struct neigh_sysctl_table *t = kmalloc(sizeof(*t), GFP_KERNEL);
+	const char *dev_name_source = NULL;
+	char *dev_name = NULL;
+	int err = 0;
 
 	if (!t)
 		return -ENOBUFS;
@@ -1644,8 +1647,10 @@
 	t->neigh_vars[9].data  = &p->anycast_delay;
 	t->neigh_vars[10].data = &p->proxy_delay;
 	t->neigh_vars[11].data = &p->locktime;
+
+ 	dev_name_source = t->neigh_dev[0].procname;
 	if (dev) {
-		t->neigh_dev[0].procname = dev->name;
+		dev_name_source = dev->name;
 		t->neigh_dev[0].ctl_name = dev->ifindex;
 		memset(&t->neigh_vars[12], 0, sizeof(ctl_table));
 	} else {
@@ -1654,6 +1659,15 @@
 		t->neigh_vars[14].data = (int *)(p + 1) + 2;
 		t->neigh_vars[15].data = (int *)(p + 1) + 3;
 	}
+
+	dev_name = net_sysctl_strdup(dev_name_source);
+	if (!dev_name) {
+		err = -ENOBUFS;
+		goto free;
+	}
+
+ 	t->neigh_dev[0].procname = dev_name;
+
 	t->neigh_neigh_dir[0].ctl_name = pdev_id;
 
 	t->neigh_proto_dir[0].procname = p_name;
@@ -1666,11 +1680,19 @@
 
 	t->sysctl_header = register_sysctl_table(t->neigh_root_dir, 0);
 	if (!t->sysctl_header) {
-		kfree(t);
-		return -ENOBUFS;
+		err = -ENOBUFS;
+		goto free_procname;
 	}
 	p->sysctl_table = t;
 	return 0;
+
+	/* error path */
+ free_procname:
+	kfree(dev_name);
+ free:
+	kfree(t);
+
+	return err;
 }
 
 void neigh_sysctl_unregister(struct neigh_parms *p)
@@ -1679,6 +1701,7 @@
 		struct neigh_sysctl_table *t = p->sysctl_table;
 		p->sysctl_table = NULL;
 		unregister_sysctl_table(t->sysctl_header);
+		kfree(t->neigh_dev[0].procname);
 		kfree(t);
 	}
 }
diff -Nru a/net/core/sysctl_net_core.c b/net/core/sysctl_net_core.c
--- a/net/core/sysctl_net_core.c	Sat Oct 18 13:16:14 2003
+++ b/net/core/sysctl_net_core.c	Sat Oct 18 13:16:14 2003
@@ -33,6 +33,19 @@
 extern char sysctl_divert_version[];
 #endif /* CONFIG_NET_DIVERT */
 
+/*
+ * This strdup() is used for creating copies of network 
+ * device names to be handed over to sysctl.
+ */
+ 
+char *net_sysctl_strdup(const char *s)
+{
+	char *rv = kmalloc(strlen(s)+1, GFP_KERNEL);
+	if (rv)
+		strcpy(rv, s);
+	return rv;
+}
+
 ctl_table core_table[] = {
 #ifdef CONFIG_NET
 	{
@@ -162,4 +175,7 @@
 #endif /* CONFIG_NET */
 	{ .ctl_name = 0 }
 };
+
+EXPORT_SYMBOL(net_sysctl_strdup);
+
 #endif
diff -Nru a/net/ipv4/devinet.c b/net/ipv4/devinet.c
--- a/net/ipv4/devinet.c	Sat Oct 18 13:16:14 2003
+++ b/net/ipv4/devinet.c	Sat Oct 18 13:16:14 2003
@@ -905,6 +905,14 @@
 		 * not interesting to applications using netlink.
 		 */
 		inetdev_changename(dev, in_dev);
+
+#ifdef CONFIG_SYSCTL
+		devinet_sysctl_unregister(&in_dev->cnf);
+		neigh_sysctl_unregister(in_dev->arp_parms);
+		neigh_sysctl_register(dev, in_dev->arp_parms, NET_IPV4,
+				      NET_IPV4_NEIGH, "ipv4");
+		devinet_sysctl_register(in_dev, &in_dev->cnf);
+#endif
 		break;
 	}
 out:
@@ -1302,6 +1310,7 @@
 	int i;
 	struct net_device *dev = in_dev ? in_dev->dev : NULL;
 	struct devinet_sysctl_table *t = kmalloc(sizeof(*t), GFP_KERNEL);
+	char *dev_name = NULL;
 
 	if (!t)
 		return;
@@ -1310,13 +1319,25 @@
 		t->devinet_vars[i].data += (char *)p - (char *)&ipv4_devconf;
 		t->devinet_vars[i].de = NULL;
 	}
+
 	if (dev) {
-		t->devinet_dev[0].procname = dev->name;
+		dev_name = dev->name; 
 		t->devinet_dev[0].ctl_name = dev->ifindex;
 	} else {
-		t->devinet_dev[0].procname = "default";
+		dev_name = "default";
 		t->devinet_dev[0].ctl_name = NET_PROTO_CONF_DEFAULT;
 	}
+
+	/* 
+	 * Make a copy of dev_name, because '.procname' is regarded as const 
+	 * by sysctl and we wouldn't want anyone to change it under our feet
+	 * (see SIOCSIFNAME).
+	 */	
+	dev_name = net_sysctl_strdup(dev_name);
+	if (!dev_name)
+	    goto free;
+
+	t->devinet_dev[0].procname    = dev_name;
 	t->devinet_dev[0].child	      = t->devinet_vars;
 	t->devinet_dev[0].de	      = NULL;
 	t->devinet_conf_dir[0].child  = t->devinet_dev;
@@ -1328,9 +1349,17 @@
 
 	t->sysctl_header = register_sysctl_table(t->devinet_root_dir, 0);
 	if (!t->sysctl_header)
-		kfree(t);
-	else
-		p->sysctl = t;
+	    goto free_procname;
+
+	p->sysctl = t;
+	return;
+
+	/* error path */
+ free_procname:
+	kfree(dev_name);
+ free:
+	kfree(t);
+	return;
 }
 
 static void devinet_sysctl_unregister(struct ipv4_devconf *p)
@@ -1339,6 +1368,7 @@
 		struct devinet_sysctl_table *t = p->sysctl;
 		p->sysctl = NULL;
 		unregister_sysctl_table(t->sysctl_header);
+		kfree(t->devinet_dev[0].procname);
 		kfree(t);
 	}
 }
diff -Nru a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
--- a/net/ipv6/addrconf.c	Sat Oct 18 13:16:14 2003
+++ b/net/ipv6/addrconf.c	Sat Oct 18 13:16:14 2003
@@ -1874,6 +1874,14 @@
 		break;
 	case NETDEV_CHANGE:
 		break;
+	case NETDEV_CHANGENAME:
+#ifdef CONFIG_SYSCTL
+		addrconf_sysctl_unregister(&idev->cnf);
+		neigh_sysctl_unregister(idev->nd_parms);
+		neigh_sysctl_register(dev, idev->nd_parms, NET_IPV6, NET_IPV6_NEIGH, "ipv6");
+		addrconf_sysctl_register(idev, &idev->cnf);
+#endif
+		break;
 	};
 
 	return NOTIFY_OK;
@@ -2904,6 +2912,7 @@
 	int i;
 	struct net_device *dev = idev ? idev->dev : NULL;
 	struct addrconf_sysctl_table *t;
+	char *dev_name = NULL;
 
 	t = kmalloc(sizeof(*t), GFP_KERNEL);
 	if (t == NULL)
@@ -2915,12 +2924,24 @@
 		t->addrconf_vars[i].extra1 = idev; /* embedded; no ref */
 	}
 	if (dev) {
-		t->addrconf_dev[0].procname = dev->name;
+		dev_name = dev->name; 
 		t->addrconf_dev[0].ctl_name = dev->ifindex;
 	} else {
-		t->addrconf_dev[0].procname = "default";
+		dev_name = "default";
 		t->addrconf_dev[0].ctl_name = NET_PROTO_CONF_DEFAULT;
 	}
+
+	/* 
+	 * Make a copy of dev_name, because '.procname' is regarded as const 
+	 * by sysctl and we wouldn't want anyone to change it under our feet
+	 * (see SIOCSIFNAME).
+	 */	
+	dev_name = net_sysctl_strdup(dev_name);
+	if (!dev_name)
+	    goto free;
+
+	t->addrconf_dev[0].procname = dev_name;
+
 	t->addrconf_dev[0].child = t->addrconf_vars;
 	t->addrconf_dev[0].de = NULL;
 	t->addrconf_conf_dir[0].child = t->addrconf_dev;
@@ -2932,9 +2953,18 @@
 
 	t->sysctl_header = register_sysctl_table(t->addrconf_root_dir, 0);
 	if (t->sysctl_header == NULL)
-		kfree(t);
+		goto free_procname;
 	else
 		p->sysctl = t;
+	return;
+
+	/* error path */
+ free_procname:
+	kfree(dev_name);
+ free:
+	kfree(t);
+
+	return;
 }
 
 static void addrconf_sysctl_unregister(struct ipv6_devconf *p)
@@ -2943,6 +2973,7 @@
 		struct addrconf_sysctl_table *t = p->sysctl;
 		p->sysctl = NULL;
 		unregister_sysctl_table(t->sysctl_header);
+		kfree(t->addrconf_dev[0].procname);
 		kfree(t);
 	}
 }

===================================================================


This BitKeeper patch contains the following changesets:
+
## Wrapped with gzip_uu ##


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
6P,)AEH^/;.R%U(HB_7]+]PG5/1P     
 


-- 
Dan Aloni
da-x@gmx.net

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

* Re: [BK PATCH 2.6] repost, fix sysctl breakage during network device renaming, for ipv4
  2003-10-18 11:20           ` Dan Aloni
@ 2003-10-21  5:57             ` David S. Miller
  0 siblings, 0 replies; 9+ messages in thread
From: David S. Miller @ 2003-10-21  5:57 UTC (permalink / raw)
  To: Dan Aloni; +Cc: netdev

On Sat, 18 Oct 2003 13:20:11 +0200
Dan Aloni <da-x@gmx.net> wrote:

> On Sat, Oct 18, 2003 at 12:01:31AM -0700, David S. Miller wrote:
> > On Fri, 17 Oct 2003 23:32:35 +0200
> > Dan Aloni <da-x@gmx.net> wrote:
> > 
> > > Here is the patch. I've compiled and tested it.
> > 
> > But not with ipv6 modular :-)  Please add the necessary
> > module symbol export for net_sysctl_strdup() and resubmit
> > the patch.
> 
> Of course, what was I thinking.

Applied, thanks Dan.

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

end of thread, other threads:[~2003-10-21  5:57 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-09-01 16:46 [BK PATCH 2.6] repost, fix sysctl breakage during network device renaming, for ipv4 Dan Aloni
2003-09-01 16:41 ` David S. Miller
2003-09-01 16:55   ` Dan Aloni
2003-09-01 18:31     ` David S. Miller
2003-09-01 18:55       ` Dan Aloni
2003-10-17 21:32       ` Dan Aloni
2003-10-18  7:01         ` David S. Miller
2003-10-18 11:20           ` Dan Aloni
2003-10-21  5:57             ` David S. 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).