On Thu, Sep 05, 2013 at 02:19:13PM +0900, Simon Horman wrote:
> struct ofputil_group_stats has an arbitrary limit
> of 16 buckets for which it can record statistics.
> However the code does not appear to enforce this
> limit and it seems to me that the code could overflow.
> 
> This patch aims to remove the arbitrary limit by
> changing the 'bucket_stats' field of struct ofputil_group_stats
> from a fixed length array to a pointer whose storage is allocated and freed
> as necessary.
> 
> Signed-off-by: Simon Horman <ho...@verge.net.au>
> 
> ---
> v3
> * As suggested by Ben Pfaff
>   - Vastly simplify the change by using an explicit pointer for
>     the 'bucket_stats' member of struct ofputil_group_stats rather
>     than implicit variable length array appended to the end of the
>     structure.

Thanks!

It looked to me that ofp_print_group_stats() shouldn't free
gs.bucket_stats on error because in that case gs.bucket_stats won't be
properly initialized, so I changed that.  And then I changed
ofputil_decode_group_stats_reply() to always initialize
gs.bucket_stats as a second measure of protection.

I folded in the following and will apply patches 1 and 2 soon.

I'll review patches 3 through 5 tomorrow during the hackathon.
(Thanks so much for participating!)

--8<--------------------------cut here-------------------------->8--

diff --git a/lib/ofp-print.c b/lib/ofp-print.c
index a794e70..6433dd0 100644
--- a/lib/ofp-print.c
+++ b/lib/ofp-print.c
@@ -2229,7 +2229,6 @@ ofp_print_group_stats(struct ds *s, const struct 
ofp_header *oh)
             if (retval != EOF) {
                 ds_put_cstr(s, " ***parse error***");
             }
-            free(gs.bucket_stats);
             break;
         }
 
diff --git a/lib/ofp-util.c b/lib/ofp-util.c
index 6573025..8ac9186 100644
--- a/lib/ofp-util.c
+++ b/lib/ofp-util.c
@@ -5480,7 +5480,8 @@ ofputil_decode_group_stats_request(const struct 
ofp_header *request,
 }
 
 /* Converts a group stats reply in 'msg' into an abstract ofputil_group_stats
- * in 'gs'.
+ * in 'gs'.  Assigns freshly allocated memory to gs->bucket_stats for the
+ * caller to eventually free.
  *
  * Multiple group stats replies can be packed into a single OpenFlow message.
  * Calling this function multiple times for a single 'msg' iterates through the
@@ -5501,6 +5502,7 @@ ofputil_decode_group_stats_reply(struct ofpbuf *msg,
     size_t length;
     size_t i;
 
+    gs->bucket_stats = NULL;
     error = (msg->l2
              ? ofpraw_decode(&raw, msg->l2)
              : ofpraw_pull(&raw, msg));
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to