summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiří Klimeš <jklimes@redhat.com>2013-09-26 11:18:09 +0200
committerJiří Klimeš <jklimes@redhat.com>2013-09-30 12:08:35 +0200
commit469febc0d93b423d33d4ea0f010c63c981f3dbca (patch)
tree21b26e7018283c844b78169e6351c7a1e5ee7546
parente69727bf8a6cd32b287c6f034a8fd489cec61747 (diff)
downloadNetworkManager-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.c20
-rw-r--r--src/rdisc/tests/rdisc.c3
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);