diff options
author | Jiří Klimeš <jklimes@redhat.com> | 2013-09-26 11:18:09 +0200 |
---|---|---|
committer | Jiří Klimeš <jklimes@redhat.com> | 2013-09-30 12:08:35 +0200 |
commit | 469febc0d93b423d33d4ea0f010c63c981f3dbca (patch) | |
tree | 21b26e7018283c844b78169e6351c7a1e5ee7546 | |
parent | e69727bf8a6cd32b287c6f034a8fd489cec61747 (diff) | |
download | NetworkManager-469febc0d93b423d33d4ea0f010c63c981f3dbca.tar.gz |
rdisc: do not crash on NDP init failures (rh #1012151)
ndp_open() can fail, do not assume it cannot.
When 'ipv6.disable=1' kernel parameter is used, the whole IPv6 stack is
disabled and the attempt to create PF_INET6 socket fails.
https://bugzilla.redhat.com/show_bug.cgi?id=1012151
-rw-r--r-- | src/rdisc/nm-lndp-rdisc.c | 20 | ||||
-rw-r--r-- | src/rdisc/tests/rdisc.c | 3 |
2 files changed, 16 insertions, 7 deletions
diff --git a/src/rdisc/nm-lndp-rdisc.c b/src/rdisc/nm-lndp-rdisc.c index ab27fa8327..cc228fe0ed 100644 --- a/src/rdisc/nm-lndp-rdisc.c +++ b/src/rdisc/nm-lndp-rdisc.c @@ -50,13 +50,23 @@ G_DEFINE_TYPE (NMLNDPRDisc, nm_lndp_rdisc, NM_TYPE_RDISC) NMRDisc * nm_lndp_rdisc_new (int ifindex, const char *ifname) { - NMRDisc *rdisc = g_object_new (NM_TYPE_LNDP_RDISC, NULL); + NMRDisc *rdisc; + NMLNDPRDiscPrivate *priv; + int error; + rdisc = g_object_new (NM_TYPE_LNDP_RDISC, NULL); g_assert (rdisc); rdisc->ifindex = ifindex; rdisc->ifname = g_strdup (ifname); + priv = NM_LNDP_RDISC_GET_PRIVATE (rdisc); + error = ndp_open (&priv->ndp); + if (error != 0) { + g_object_unref (rdisc); + debug ("(%s): error creating socket for NDP; errno=%d", ifname, -error); + return NULL; + } return rdisc; } @@ -594,11 +604,6 @@ start (NMRDisc *rdisc) static void nm_lndp_rdisc_init (NMLNDPRDisc *lndp_rdisc) { - NMLNDPRDiscPrivate *priv = NM_LNDP_RDISC_GET_PRIVATE (lndp_rdisc); - int error; - - error = ndp_open (&priv->ndp); - g_assert (!error); } static void @@ -615,7 +620,8 @@ nm_lndp_rdisc_finalize (GObject *object) if (priv->event_id) g_source_remove (priv->event_id); - ndp_close (priv->ndp); + if (priv->ndp) + ndp_close (priv->ndp); } static void diff --git a/src/rdisc/tests/rdisc.c b/src/rdisc/tests/rdisc.c index 89da3154dc..680bb2e4df 100644 --- a/src/rdisc/tests/rdisc.c +++ b/src/rdisc/tests/rdisc.c @@ -35,6 +35,9 @@ main (int argc, char **argv) } rdisc = new (ifindex, ifname); + if (!rdisc) + return EXIT_FAILURE; + nm_rdisc_set_lladdr (rdisc, mac, 6); nm_rdisc_start (rdisc); |