That's a good point. We only have one in-tree user, which I updated, so I guess I'm not too worried.
Thanks, I'll push this soon, and then backport to branch-2.1 On Sat, Apr 05, 2014 at 10:33:02AM -0700, Jarno Rajahalme wrote: > (Did not check if there are other users of ofperr_decode_msg(), maybe > it would have been a good idea to change the signature in some way to > cause at least a warning in case some other users exist out there.) > > Looks good to me, > > Acked-by: Jarno Rajahalme <jrajaha...@nicira.com> > > > > On Apr 4, 2014, at 7:30 PM, Ben Pfaff <b...@nicira.com> wrote: > > > > The body of an OpenFlow error message often contains an inner OpenFlow > > message, and when it does, the inner message starts at an odd multiple of 4 > > bytes from the beginning of the outer message. That means that, on RISC > > systems, accessing the inner message directly causes a bus error. This > > commit fixes the problem in a way that should make it difficult to recur. > > > > This fixes the failure of tests 643, 645, and 651 on sparc seen here: > > https://buildd.debian.org/status/fetch.php?pkg=openvswitch&arch=sparc&ver=2.1.0%2Bgit20140325-1&stamp=1396438624 > > > > Signed-off-by: Ben Pfaff <b...@nicira.com> > > --- > > lib/ofp-errors.c | 11 +++++++---- > > lib/ofp-print.c | 1 + > > 2 files changed, 8 insertions(+), 4 deletions(-) > > > > diff --git a/lib/ofp-errors.c b/lib/ofp-errors.c > > index d1e4dbf..bd4e43a 100644 > > --- a/lib/ofp-errors.c > > +++ b/lib/ofp-errors.c > > @@ -1,5 +1,5 @@ > > /* > > - * Copyright (c) 2012, 2013 Nicira, Inc. > > + * Copyright (c) 2012, 2013, 2014 Nicira, Inc. > > * > > * Licensed under the Apache License, Version 2.0 (the "License"); > > * you may not use this file except in compliance with the License. > > @@ -272,8 +272,10 @@ ofperr_get_code(enum ofperr error, enum ofp_version > > version) > > /* Tries to decode 'oh', which should be an OpenFlow OFPT_ERROR message. > > * Returns an OFPERR_* constant on success, 0 on failure. > > * > > - * If 'payload' is nonnull, on success '*payload' is initialized to the > > - * error's payload, and on failure it is cleared. */ > > + * If 'payload' is nonnull, on success '*payload' is initialized with a > > copy of > > + * the error's payload (copying is required because the payload is not > > properly > > + * aligned). The caller must free the payload (with ofpbuf_uninit()) when > > it > > + * is no longer needed. On failure, '*payload' is cleared. */ > > enum ofperr > > ofperr_decode_msg(const struct ofp_header *oh, struct ofpbuf *payload) > > { > > @@ -323,7 +325,8 @@ ofperr_decode_msg(const struct ofp_header *oh, struct > > ofpbuf *payload) > > /* Translate the error type and code into an ofperr. */ > > error = ofperr_decode(oh->version, vendor, type, code); > > if (error && payload) { > > - ofpbuf_use_const(payload, ofpbuf_data(&b), ofpbuf_size(&b)); > > + ofpbuf_init(payload, ofpbuf_size(&b)); > > + ofpbuf_push(payload, ofpbuf_data(&b), ofpbuf_size(&b)); > > } > > return error; > > } > > diff --git a/lib/ofp-print.c b/lib/ofp-print.c > > index c8c331e..e0e565c 100644 > > --- a/lib/ofp-print.c > > +++ b/lib/ofp-print.c > > @@ -1367,6 +1367,7 @@ ofp_print_error_msg(struct ds *string, const struct > > ofp_header *oh) > > ds_put_cstr(string, s); > > free(s); > > } > > + ofpbuf_uninit(&payload); > > } > > > > static void > > -- > > 1.8.5.3 > > > > _______________________________________________ > > dev mailing list > > dev@openvswitch.org > > http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev