Message ID | 1539897049-5070-2-git-send-email-pkusunyifeng@gmail.com |
---|---|
State | Accepted |
Headers | show |
Series | [ovs-dev,v2] odp-util: Move ufid handling to odp_flow_from_string | expand |
On Thu, Oct 18, 2018 at 02:10:48PM -0700, Yifeng Sun wrote: > When parse_odp_key_mask_attr runs into ufid, it returns length of ufid > without further parsing. This causes problem to set action in function > parse_odp_action where nested nlattrs are expected from ofpbuf after. > > Since in all callers of parse_odp_key_mask_attr, only odp_flow_from_string > needs to understand ufid. This patch moves ufid parsing from > parse_odp_key_mask_attr out to odp_flow_from_string. > > Reported-by: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10850 > Signed-off-by: Yifeng Sun <pkusunyifeng@gmail.com> > --- > v1->v2: Improved according to Ben's review. Thanks, applied to master and backported.
diff --git a/lib/odp-util.c b/lib/odp-util.c index 7705bb30ae21..d156fa7265de 100644 --- a/lib/odp-util.c +++ b/lib/odp-util.c @@ -5364,13 +5364,6 @@ static int parse_odp_key_mask_attr(const char *s, const struct simap *port_names, struct ofpbuf *key, struct ofpbuf *mask) { - /* Skip UFID. */ - ovs_u128 ufid; - int ufid_len = odp_ufid_from_string(s, &ufid); - if (ufid_len) { - return ufid_len; - } - SCAN_SINGLE("skb_priority(", uint32_t, u32, OVS_KEY_ATTR_PRIORITY); SCAN_SINGLE("skb_mark(", uint32_t, u32, OVS_KEY_ATTR_SKB_MARK); SCAN_SINGLE_FULLY_MASKED("recirc_id(", uint32_t, u32, @@ -5583,6 +5576,17 @@ odp_flow_from_string(const char *s, const struct simap *port_names, return 0; } + /* Skip UFID. */ + ovs_u128 ufid; + retval = odp_ufid_from_string(s, &ufid); + if (retval < 0) { + key->size = old_size; + return -retval; + } else if (retval > 0) { + s += retval; + s += s[0] == ' ' ? 1 : 0; + } + retval = parse_odp_key_mask_attr(s, port_names, key, mask); if (retval < 0) { key->size = old_size;
When parse_odp_key_mask_attr runs into ufid, it returns length of ufid without further parsing. This causes problem to set action in function parse_odp_action where nested nlattrs are expected from ofpbuf after. Since in all callers of parse_odp_key_mask_attr, only odp_flow_from_string needs to understand ufid. This patch moves ufid parsing from parse_odp_key_mask_attr out to odp_flow_from_string. Reported-by: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10850 Signed-off-by: Yifeng Sun <pkusunyifeng@gmail.com> --- v1->v2: Improved according to Ben's review. lib/odp-util.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-)