X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=inline;f=vswitchd%2Fbridge.c;h=4e2833e0be70b2c0b65754bfd762d9817ede4498;hb=5af5b5324cfc096ff80e96b06b3eb4d6f03307a3;hp=186f2501870a88d35b3ece9a6eecf6e26ea40f92;hpb=86dc65011b820698dab5f1e4cb5083d20f14aad4;p=openvswitch diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index 186f2501..4e2833e0 100644 --- a/vswitchd/bridge.c +++ b/vswitchd/bridge.c @@ -739,9 +739,16 @@ add_del_bridges(const struct ovsrec_open_vswitch *cfg) /* Collect new bridges' names and types. */ shash_init(&new_br); for (i = 0; i < cfg->n_bridges; i++) { + static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); const struct ovsrec_bridge *br_cfg = cfg->bridges[i]; - if (!shash_add_once(&new_br, br_cfg->name, br_cfg)) { - VLOG_WARN("bridge %s specified twice", br_cfg->name); + + if (strchr(br_cfg->name, '/')) { + /* Prevent remote ovsdb-server users from accessing arbitrary + * directories, e.g. consider a bridge named "../../../etc/". */ + VLOG_WARN_RL(&rl, "ignoring bridge with invalid name \"%s\"", + br_cfg->name); + } else if (!shash_add_once(&new_br, br_cfg->name, br_cfg)) { + VLOG_WARN_RL(&rl, "bridge %s specified twice", br_cfg->name); } }