2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-30 22:05:19 +00:00

ofp-parse: Validate range of table, priority, and timeout values.

Otherwise, "table=257" (e.g.) was silently accepted but had a surprising
effect.

Bug #7445.
Reported-by: Michael Mao <mmao@nicira.com>
This commit is contained in:
Ben Pfaff
2011-09-27 16:58:55 -07:00
parent 68cb8aaf0a
commit c3636ffc10

View File

@@ -41,6 +41,28 @@
VLOG_DEFINE_THIS_MODULE(ofp_parse);
static uint8_t
str_to_table_id(const char *str)
{
int table_id;
if (!str_to_int(str, 10, &table_id) || table_id < 0 || table_id > 255) {
ovs_fatal(0, "invalid table \"%s\"", str);
}
return table_id;
}
static uint16_t
str_to_u16(const char *str, const char *name)
{
int value;
if (!str_to_int(str, 0, &value) || value < 0 || value > 65535) {
ovs_fatal(0, "invalid %s \"%s\"", name, str);
}
return value;
}
static uint32_t
str_to_u32(const char *str)
{
@@ -541,15 +563,15 @@ parse_ofp_str(struct ofputil_flow_mod *fm, int command, const char *str_,
}
if (!strcmp(name, "table")) {
fm->table_id = atoi(value);
fm->table_id = str_to_table_id(value);
} else if (!strcmp(name, "out_port")) {
fm->out_port = atoi(value);
} else if (fields & F_PRIORITY && !strcmp(name, "priority")) {
fm->cr.priority = atoi(value);
fm->cr.priority = str_to_u16(value, name);
} else if (fields & F_TIMEOUT && !strcmp(name, "idle_timeout")) {
fm->idle_timeout = atoi(value);
fm->idle_timeout = str_to_u16(value, name);
} else if (fields & F_TIMEOUT && !strcmp(name, "hard_timeout")) {
fm->hard_timeout = atoi(value);
fm->hard_timeout = str_to_u16(value, name);
} else if (fields & F_COOKIE && !strcmp(name, "cookie")) {
fm->cookie = htonll(str_to_u64(value));
} else if (mf_from_name(name)) {