summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhiqi Chen <chenzhiqi.123@bytedance.com>2023-05-10 16:35:37 +0800
committerIlya Maximets <i.maximets@ovn.org>2023-05-11 21:40:13 +0200
commitf4cc9ca82472688a6360f7dafb89b38898ada98a (patch)
tree4cb7ba56e9538017dac29784da2819f99ba5e845
parent9e27e8fe81ab8d3b3ede107927cff72d9f85374d (diff)
downloadopenvswitch-branch-3.1.tar.gz
dpctl: Fix dereferencing null pointer in parse_ct_limit_zones().branch-3.1
Command with empty string following "dpctl/ct-get-limits zone=" such as "ovs-appctl dpctl/ct-get-limits zone=" will cause parse_ct_limit_zones() dereferencing null. Signed-off-by: Zhiqi Chen <chenzhiqi.123@bytedance.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
-rw-r--r--lib/dpctl.c5
-rw-r--r--tests/dpctl.at16
2 files changed, 19 insertions, 2 deletions
diff --git a/lib/dpctl.c b/lib/dpctl.c
index 970373389..bfc397329 100644
--- a/lib/dpctl.c
+++ b/lib/dpctl.c
@@ -2202,7 +2202,7 @@ parse_ct_limit_zones(const char *argv, struct ovs_list *zone_limits,
argcopy = xstrdup(argv + 5);
next_zone = strtok_r(argcopy, ",", &save_ptr);
- do {
+ while (next_zone != NULL) {
if (ovs_scan(next_zone, "%"SCNu16, &zone)) {
ct_dpif_push_zone_limit(zone_limits, zone, 0, 0);
} else {
@@ -2210,7 +2210,8 @@ parse_ct_limit_zones(const char *argv, struct ovs_list *zone_limits,
free(argcopy);
return EINVAL;
}
- } while ((next_zone = strtok_r(NULL, ",", &save_ptr)) != NULL);
+ next_zone = strtok_r(NULL, ",", &save_ptr);
+ }
free(argcopy);
return 0;
diff --git a/tests/dpctl.at b/tests/dpctl.at
index 7454a51ec..d2f1046f8 100644
--- a/tests/dpctl.at
+++ b/tests/dpctl.at
@@ -135,3 +135,19 @@ AT_CHECK([ovs-appctl dpctl/dump-flows dummy@br0 | sort], [0], [dnl
AT_CHECK([ovs-appctl dpctl/del-dp dummy@br0])
OVS_VSWITCHD_STOP
AT_CLEANUP
+
+AT_SETUP([dpctl - ct-get-limits ct-del-limits])
+OVS_VSWITCHD_START
+AT_CHECK([ovs-appctl dpctl/ct-get-limits], [0], [default limit=0
+])
+AT_CHECK([ovs-appctl dpctl/ct-get-limits zone=], [0], [default limit=0
+])
+AT_CHECK([ovs-appctl dpctl/ct-get-limits zone=,], [0], [default limit=0
+])
+AT_CHECK([ovs-appctl dpctl/ct-get-limits zone=x], [2], [],
+ [ovs-vswitchd: invalid zone (Invalid argument)
+ovs-appctl: ovs-vswitchd: server returned an error
+])
+AT_CHECK([ovs-appctl dpctl/ct-del-limits zone=])
+OVS_VSWITCHD_STOP
+AT_CLEANUP \ No newline at end of file