about summary refs log tree commit diff
path: root/pkgs/tools/networking/dhcpcd
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2014-04-24 15:08:31 +0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2014-04-24 15:19:26 +0200
commit2d8c0d24f206a3eb32cd86653fa6e70f8018929c (patch)
treed6a21f5a647b04eebf6443261abab2a015421b95 /pkgs/tools/networking/dhcpcd
parent25af3671f9f33c066acd40702268b0fdb900b238 (diff)
dhcpcd: Fix segfaults
This fixes several problems in the dhcpcd service:

* A segfault during startup, due to a race with udev (dhcpcd would get
  an ADD event from udev, causing it to re-add an interface that it
  already had, leading to a segfault later on).

* A hang/segfault processing "dhcpcd rebind" (which NixOS calls after
  waking up from suspend).

Also, add "lo" to the list of ignored interfaces. It usually ignores
"lo", but apparently not when it gets an ADD event from udev.
Diffstat (limited to 'pkgs/tools/networking/dhcpcd')
-rw-r--r--pkgs/tools/networking/dhcpcd/check-interface.patch24
-rw-r--r--pkgs/tools/networking/dhcpcd/default.nix2
-rw-r--r--pkgs/tools/networking/dhcpcd/reload.patch22
3 files changed, 47 insertions, 1 deletions
diff --git a/pkgs/tools/networking/dhcpcd/check-interface.patch b/pkgs/tools/networking/dhcpcd/check-interface.patch
new file mode 100644
index 0000000000000..2b732b740ad40
--- /dev/null
+++ b/pkgs/tools/networking/dhcpcd/check-interface.patch
@@ -0,0 +1,24 @@
+Index: dhcpcd.c
+==================================================================
+--- a/dhcpcd.c
++++ b/dhcpcd.c
+@@ -747,14 +747,14 @@
+ 			if (ifp->hwlen != 0)
+ 				memcpy(ifl->hwaddr, ifp->hwaddr, ifl->hwlen);
+ 		} else {
+ 			TAILQ_REMOVE(ifs, ifp, next);
+ 			TAILQ_INSERT_TAIL(ctx->ifaces, ifp, next);
+-		}
+-		if (action == 1) {
+-			init_state(ifp, ctx->argc, ctx->argv);
+-			start_interface(ifp);
++			if (action == 1) {
++				init_state(ifp, ctx->argc, ctx->argv);
++				start_interface(ifp);
++			}
+ 		}
+ 	}
+ 
+ 	/* Free our discovered list */
+ 	while ((ifp = TAILQ_FIRST(ifs))) {
+
diff --git a/pkgs/tools/networking/dhcpcd/default.nix b/pkgs/tools/networking/dhcpcd/default.nix
index d247dbe38aa68..40f6538750f19 100644
--- a/pkgs/tools/networking/dhcpcd/default.nix
+++ b/pkgs/tools/networking/dhcpcd/default.nix
@@ -8,7 +8,7 @@ stdenv.mkDerivation rec {
     sha256 = "1v2m5wdr6x5cz6i0n1y63am9dhj5j7ylrk717scjgwwjdbq1x75n";
   };
 
-  patches = [ ./lxc_ro_promote_secondaries.patch ];
+  patches = [ ./lxc_ro_promote_secondaries.patch ./reload.patch ./check-interface.patch ];
 
   buildInputs = [ pkgconfig udev ];
 
diff --git a/pkgs/tools/networking/dhcpcd/reload.patch b/pkgs/tools/networking/dhcpcd/reload.patch
new file mode 100644
index 0000000000000..0ecb75a447609
--- /dev/null
+++ b/pkgs/tools/networking/dhcpcd/reload.patch
@@ -0,0 +1,22 @@
+--- a/dhcpcd.c
++++ b/dhcpcd.c
+@@ -143,16 +143,18 @@
+ 	if (ctx->ifac) {
+ 		for (ctx->ifac--; ctx->ifac >= 0; ctx->ifac--)
+ 			free(ctx->ifav[ctx->ifac]);
+ 		free(ctx->ifav);
+ 		ctx->ifav = NULL;
++		ctx->ifac = 0;
+ 	}
+ 	if (ctx->ifdc) {
+ 		for (ctx->ifdc--; ctx->ifdc >= 0; ctx->ifdc--)
+ 			free(ctx->ifdv[ctx->ifdc]);
+ 		free(ctx->ifdv);
+ 		ctx->ifdv = NULL;
++		ctx->ifdc = 0;
+ 	}
+ 
+ #ifdef INET
+ 	if (ctx->dhcp_opts) {
+ 		for (opt = ctx->dhcp_opts;
+