dpctl: Fix "add-flow" and "add-flows" when actions are specified.
authorBen Pfaff <blp@nicira.com>
Wed, 14 Jan 2009 22:08:40 +0000 (14:08 -0800)
committerBen Pfaff <blp@nicira.com>
Wed, 14 Jan 2009 23:19:44 +0000 (15:19 -0800)
Thanks to Justin for noticing the problem.

utilities/dpctl.c

index 828e33a3fe29c8b8a02ab12c4f5fa0db297d7c0b..603412765770121eda8c7105f03cab37444bdd0e 100644 (file)
@@ -944,11 +944,15 @@ do_add_flow(const struct settings *s UNUSED, int argc UNUSED, char *argv[])
     struct ofpbuf *buffer;
     struct ofp_flow_mod *ofm;
     uint16_t priority, idle_timeout, hard_timeout;
+    struct ofp_match match;
 
-    /* Parse and send. */
-    ofm = make_openflow(sizeof *ofm, OFPT_FLOW_MOD, &buffer);
-    str_to_flow(argv[2], &ofm->match, buffer,
+    /* Parse and send.  str_to_flow() will expand and reallocate the data in
+     * 'buffer', so we can't keep pointers to across the str_to_flow() call. */
+    make_openflow(sizeof *ofm, OFPT_FLOW_MOD, &buffer);
+    str_to_flow(argv[2], &match, buffer,
                 NULL, NULL, &priority, &idle_timeout, &hard_timeout);
+    ofm = buffer->data;
+    ofm->match = match;
     ofm->command = htons(OFPFC_ADD);
     ofm->idle_timeout = htons(idle_timeout);
     ofm->hard_timeout = htons(hard_timeout);
@@ -978,6 +982,7 @@ do_add_flows(const struct settings *s UNUSED, int argc UNUSED, char *argv[])
         struct ofpbuf *buffer;
         struct ofp_flow_mod *ofm;
         uint16_t priority, idle_timeout, hard_timeout;
+        struct ofp_match match;
 
         char *comment;
 
@@ -992,10 +997,14 @@ do_add_flows(const struct settings *s UNUSED, int argc UNUSED, char *argv[])
             continue;
         }
 
-        /* Parse and send. */
+        /* Parse and send.  str_to_flow() will expand and reallocate the data
+         * in 'buffer', so we can't keep pointers to across the str_to_flow()
+         * call. */
         ofm = make_openflow(sizeof *ofm, OFPT_FLOW_MOD, &buffer);
-        str_to_flow(line, &ofm->match, buffer,
+        str_to_flow(line, &match, buffer,
                     NULL, NULL, &priority, &idle_timeout, &hard_timeout);
+        ofm = buffer->data;
+        ofm->match = match;
         ofm->command = htons(OFPFC_ADD);
         ofm->idle_timeout = htons(idle_timeout);
         ofm->hard_timeout = htons(hard_timeout);