diff options
author | Flavio Fernandes <flavio@flaviof.com> | 2021-03-17 14:14:18 -0400 |
---|---|---|
committer | Ilya Maximets <i.maximets@ovn.org> | 2021-04-01 01:42:28 +0200 |
commit | 31629b5383c3ce2d3ca63377deade28498bb8a1b (patch) | |
tree | a074cbcc1ee3d650a3504c4a9845649ef053dced /utilities/ovs-ofctl.c | |
parent | b4a9c9cd848b56d538f17f94cde78d5a139c7d90 (diff) | |
download | openvswitch-31629b5383c3ce2d3ca63377deade28498bb8a1b.tar.gz |
ovs-ofctl: Fix segfault due to bad meter n_bands.
Meter commands internally use ofctl_meter_mod__() and
ofctl_meter_request__() functions, which have an optional parameter
called str. When str is NULL, these 2 functions initialize a struct
with meter bands set as NULL. It also needs to set meter n_bands to 0.
Once del-meters change in test dpif-netdev.at is added, the valgrind
report on test '992: dpif-netdev - meters' shows this issue:
Conditional jump or move depends on uninitialised value(s)
at 0x473534: ofputil_put_bands (ofp-meter.c:207)
by 0x473534: ofputil_encode_meter_mod (ofp-meter.c:557)
by 0x40FBA2: ofctl_meter_mod__ (ovs-ofctl.c:4038)
by 0x417BD3: ovs_cmdl_run_command__ (command-line.c:247)
by 0x4078BA: main (ovs-ofctl.c:179)
Uninitialised value was created by a stack allocation
at 0x409350: ofctl_del_meters (ovs-ofctl.c:4088)
Fixes: 3200ed5805 ("ovs-ofctl: Add meter support.")
Signed-off-by: Flavio Fernandes <flavio@flaviof.com>
Acked-by: Aaron Conole <aconole@redhat.com>
Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
Diffstat (limited to 'utilities/ovs-ofctl.c')
-rw-r--r-- | utilities/ovs-ofctl.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c index 3601890f4..62059e962 100644 --- a/utilities/ovs-ofctl.c +++ b/utilities/ovs-ofctl.c @@ -4020,6 +4020,7 @@ ofctl_meter_mod__(const char *bridge, const char *str, int command) enum ofputil_protocol usable_protocols; enum ofp_version version; + memset(&mm, 0, sizeof mm); if (str) { char *error; error = parse_ofp_meter_mod_str(&mm, str, command, &usable_protocols); @@ -4030,7 +4031,6 @@ ofctl_meter_mod__(const char *bridge, const char *str, int command) usable_protocols = OFPUTIL_P_OF13_UP; mm.command = command; mm.meter.meter_id = OFPM13_ALL; - mm.meter.bands = NULL; } protocol = open_vconn_for_flow_mod(bridge, &vconn, usable_protocols); @@ -4050,6 +4050,7 @@ ofctl_meter_request__(const char *bridge, const char *str, enum ofputil_protocol protocol; enum ofp_version version; + memset(&mm, 0, sizeof mm); if (str) { char *error; error = parse_ofp_meter_mod_str(&mm, str, -1, &usable_protocols); @@ -4059,7 +4060,6 @@ ofctl_meter_request__(const char *bridge, const char *str, } else { usable_protocols = OFPUTIL_P_OF13_UP; mm.meter.meter_id = OFPM13_ALL; - mm.meter.bands = NULL; } protocol = open_vconn_for_flow_mod(bridge, &vconn, usable_protocols); |