This commit fixes a bug in the parse_flag() function which causes failure of parsing tunnel flags like:
tunnel(tun_id=0x0,src=1.2.3.4,dst=1.2.3.5,tos=0,ttl=64,flags(-df+csum+key)) Reported-by: Jacob Cherkas <jcher...@nicira.com> Signed-off-by: Alex Wang <al...@nicira.com> --- lib/odp-util.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/odp-util.c b/lib/odp-util.c index b82edb7..962b84b 100644 --- a/lib/odp-util.c +++ b/lib/odp-util.c @@ -231,21 +231,22 @@ parse_flags(const char *s, const char *(*bit_to_string)(uint32_t), uint32_t flags = 0, mask = 0; /* Parse masked flags. */ - while (s[n] != ')') { + while (s[0] != ')') { bool set; uint32_t bit; int name_len; - if (s[n] == '+') { + if (s[0] == '+') { set = true; - } else if (s[n] == '-') { + } else if (s[0] == '-') { set = false; } else { return -EINVAL; } + s++; n++; - name_len = strcspn(s + n, "+-)"); + name_len = strcspn(s, "+-)"); for (bit = 1; bit; bit <<= 1) { const char *fname = bit_to_string(bit); @@ -259,7 +260,7 @@ parse_flags(const char *s, const char *(*bit_to_string)(uint32_t), if (len != name_len) { continue; } - if (!strncmp(s + n, fname, len)) { + if (!strncmp(s, fname, len)) { if (mask & bit) { /* bit already set. */ return -EINVAL; @@ -279,6 +280,7 @@ parse_flags(const char *s, const char *(*bit_to_string)(uint32_t), return -EINVAL; /* Unknown flag name */ } s += name_len; + n += name_len; } *res_flags = flags; -- 1.7.9.5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev