diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2014-04-24 15:08:31 +0200 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2014-04-24 15:19:26 +0200 |
commit | 2d8c0d24f206a3eb32cd86653fa6e70f8018929c (patch) | |
tree | d6a21f5a647b04eebf6443261abab2a015421b95 /pkgs/tools/networking | |
parent | 25af3671f9f33c066acd40702268b0fdb900b238 (diff) | |
download | nixlib-2d8c0d24f206a3eb32cd86653fa6e70f8018929c.tar nixlib-2d8c0d24f206a3eb32cd86653fa6e70f8018929c.tar.gz nixlib-2d8c0d24f206a3eb32cd86653fa6e70f8018929c.tar.bz2 nixlib-2d8c0d24f206a3eb32cd86653fa6e70f8018929c.tar.lz nixlib-2d8c0d24f206a3eb32cd86653fa6e70f8018929c.tar.xz nixlib-2d8c0d24f206a3eb32cd86653fa6e70f8018929c.tar.zst nixlib-2d8c0d24f206a3eb32cd86653fa6e70f8018929c.zip |
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')
-rw-r--r-- | pkgs/tools/networking/dhcpcd/check-interface.patch | 24 | ||||
-rw-r--r-- | pkgs/tools/networking/dhcpcd/default.nix | 2 | ||||
-rw-r--r-- | pkgs/tools/networking/dhcpcd/reload.patch | 22 |
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 000000000000..2b732b740ad4 --- /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 d247dbe38aa6..40f6538750f1 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 000000000000..0ecb75a44760 --- /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; + |