From: Ben Pfaff Date: Mon, 7 Dec 2009 21:02:37 +0000 (-0800) Subject: vswitchd: Avoid segfault when local port is required but missing. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e073f944f58df72091db46fad0bef76715d30f5d;p=openvswitch vswitchd: Avoid segfault when local port is required but missing. Connecting to a controller requires the vswitch to have a local port (typically named the same as the bridge itself). Before the introduction of ovsdb ovs-vswitchd simply added the local port itself if it was missing. This was not properly implemented with the ovsdb transition, and a segfault resulted. This commit avoids the segfault, although it should possibly be improved to also add the local port, as before. CC: Jeremy Stribling --- diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index 2aeb3f76..20557773 100644 --- a/vswitchd/bridge.c +++ b/vswitchd/bridge.c @@ -1232,14 +1232,21 @@ bridge_reconfigure_one(const struct ovsrec_open_vswitch *ovs_cfg, br->name, name); } } + + /* If we have a controller, then we need a local port. Complain if the + * user didn't specify one. + * + * XXX perhaps we should synthesize a port ourselves in this case. */ if (bridge_get_controller(ovs_cfg, br)) { char local_name[IF_NAMESIZE]; int error; error = dpif_port_get_name(br->dpif, ODPP_LOCAL, local_name, sizeof local_name); - if (!error) { - shash_add_once(&new_ports, local_name, NULL); + if (!error && !shash_find(&new_ports, local_name)) { + VLOG_WARN("bridge %s: controller specified but no local port " + "(port named %s) defined", + br->name, local_name); } }