learn_parse() and learn_check() are supposed to apply the same checks, but
they are implemented very differently.  It seems best to have learn_parse()
actually call learn_check() just to be sure.

This would have caught the bug fixed in the previous commit, because
the tests actually contain instances of "learn" actions that trigger the
bug, but the tests only parsed the actions without ever doing anything
that checked them (like sending them to ovs-vswitchd over OpenFlow).
---
 lib/learn.c |   10 +++++++++-
 1 files changed, 9 insertions(+), 1 deletions(-)

diff --git a/lib/learn.c b/lib/learn.c
index 8d7e0b0..9f95a13 100644
--- a/lib/learn.c
+++ b/lib/learn.c
@@ -414,6 +414,7 @@ learn_parse(struct ofpbuf *b, char *arg, const struct flow 
*flow)
     char *name, *value;
     size_t learn_ofs;
     size_t len;
+    int error;
 
     struct nx_action_learn *learn;
     struct cls_rule rule;
@@ -497,7 +498,6 @@ learn_parse(struct ofpbuf *b, char *arg, const struct flow 
*flow)
             }
         }
     }
-    free(orig);
 
     put_u16(b, 0);
 
@@ -508,6 +508,14 @@ learn_parse(struct ofpbuf *b, char *arg, const struct flow 
*flow)
 
     learn = ofpbuf_at_assert(b, learn_ofs, sizeof *learn);
     learn->len = htons(b->size - learn_ofs);
+
+    /* In theory the above should have caught any errors, but... */
+    error = learn_check(learn, flow);
+    if (error) {
+        char *msg = ofputil_error_to_string(error);
+        ovs_fatal(0, "%s: %s", orig, msg);
+    }
+    free(orig);
 }
 
 void
-- 
1.7.4.4

_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev

Reply via email to