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

Reply via email to