From b4fa9d4064a4725f70eba594cf9d25165647e99d Mon Sep 17 00:00:00 2001 From: Romain Lenglet Date: Wed, 20 Nov 2013 10:57:52 -0800 Subject: [PATCH] ipfix: fix segfault for Flow_Sample_Collector_Set without ipfix Guard any access to an IPFIX row referenced from Flow_Sample_Collector_Set by a test that the reference is not NULL. Signed-off-by: Romain Lenglet Signed-off-by: Ben Pfaff --- vswitchd/bridge.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index b3ca42b08..243253dc3 100644 --- a/vswitchd/bridge.c +++ b/vswitchd/bridge.c @@ -987,6 +987,14 @@ bridge_configure_sflow(struct bridge *br, int *sflow_bridge_number) sset_destroy(&oso.targets); } +/* Returns whether a Flow_Sample_Collector_Set row is valid. */ +static bool +ovsrec_fscs_is_valid(const struct ovsrec_flow_sample_collector_set *fscs, + const struct bridge *br) +{ + return fscs->ipfix && fscs->bridge == br->cfg; +} + /* Set IPFIX configuration on 'br'. */ static void bridge_configure_ipfix(struct bridge *br) @@ -998,7 +1006,7 @@ bridge_configure_ipfix(struct bridge *br) size_t n_fe_opts = 0; OVSREC_FLOW_SAMPLE_COLLECTOR_SET_FOR_EACH(fe_cfg, idl) { - if (fe_cfg->bridge == br->cfg) { + if (ovsrec_fscs_is_valid(fe_cfg, br)) { n_fe_opts++; } } @@ -1038,7 +1046,7 @@ bridge_configure_ipfix(struct bridge *br) fe_opts = xcalloc(n_fe_opts, sizeof *fe_opts); opts = fe_opts; OVSREC_FLOW_SAMPLE_COLLECTOR_SET_FOR_EACH(fe_cfg, idl) { - if (fe_cfg->bridge == br->cfg) { + if (ovsrec_fscs_is_valid(fe_cfg, br)) { opts->collector_set_id = fe_cfg->id; sset_init(&opts->targets); sset_add_array(&opts->targets, fe_cfg->ipfix->targets, -- 2.20.1