diff --git a/ofproto/bundles.h b/ofproto/bundles.h index 806e853d6..1164fddd8 100644 --- a/ofproto/bundles.h +++ b/ofproto/bundles.h @@ -58,8 +58,6 @@ struct ofp_bundle { struct ovs_list msg_list; /* List of 'struct bundle_message's */ }; -static inline struct ofp_bundle_entry *ofp_bundle_entry_alloc( - enum ofptype type, const struct ofp_header *oh); static inline void ofp_bundle_entry_free(struct ofp_bundle_entry *); enum ofperr ofp_bundle_open(struct ofconn *, uint32_t id, uint16_t flags, @@ -72,17 +70,6 @@ enum ofperr ofp_bundle_add_message(struct ofconn *, uint32_t id, void ofp_bundle_remove__(struct ofconn *, struct ofp_bundle *); -static inline struct ofp_bundle_entry * -ofp_bundle_entry_alloc(enum ofptype type, const struct ofp_header *oh) -{ - struct ofp_bundle_entry *entry = xmalloc(sizeof *entry); - - entry->type = type; - entry->msg = xmemdup(oh, ntohs(oh->length)); - - return entry; -} - static inline void ofp_bundle_entry_free(struct ofp_bundle_entry *entry) { diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index 4af7e6486..b9d53dfdd 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -7906,7 +7906,6 @@ handle_bundle_add(struct ofconn *ofconn, const struct ofp_header *oh) struct ofproto *ofproto = ofconn_get_ofproto(ofconn); enum ofperr error; struct ofputil_bundle_add_msg badd; - struct ofp_bundle_entry *bmsg; enum ofptype type; error = reject_slave_controller(ofconn); @@ -7919,7 +7918,8 @@ handle_bundle_add(struct ofconn *ofconn, const struct ofp_header *oh) return error; } - bmsg = ofp_bundle_entry_alloc(type, badd.msg); + /* Allocate bundle entry and decode the embedded message. */ + struct ofp_bundle_entry *bmsg = xmalloc(sizeof *bmsg); struct ofpbuf ofpacts; uint64_t ofpacts_stub[1024 / 8]; @@ -7958,18 +7958,23 @@ handle_bundle_add(struct ofconn *ofconn, const struct ofp_header *oh) } else { OVS_NOT_REACHED(); } - ofpbuf_uninit(&ofpacts); - - if (!error) { - error = ofp_bundle_add_message(ofconn, badd.bundle_id, badd.flags, - bmsg, oh); + if (error) { + free(bmsg); + return error; } + /* Now that the embedded message has been successfully decoded, finish up + * initializing the bundle entry. */ + bmsg->type = type; + bmsg->msg = xmemdup(oh, ntohs(oh->length)); + + /* Add bundle entry to bundle. */ + error = ofp_bundle_add_message(ofconn, badd.bundle_id, badd.flags, + bmsg, oh); if (error) { ofp_bundle_entry_free(bmsg); } - return error; }