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 <[email protected]>
>
> ---
> 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
[email protected]
http://openvswitch.org/mailman/listinfo/dev