Looks good, but I think similar changes should be made to ofp_port_reason_to_string() and OFP_PORT_REASON_BUFSIZE.
--Justin On Jun 12, 2013, at 2:45 PM, Ben Pfaff <b...@nicira.com> wrote: > Returning a static data buffer makes code more brittle and definitely > not thread-safe, so this commit switches to using a caller-provided > buffer instead. > > Signed-off-by: Ben Pfaff <b...@nicira.com> > --- > lib/ofp-print.c | 47 ++++++++++++++++++++++++++++++++--------------- > 1 files changed, 32 insertions(+), 15 deletions(-) > > diff --git a/lib/ofp-print.c b/lib/ofp-print.c > index 9471385..092a4bc 100644 > --- a/lib/ofp-print.c > +++ b/lib/ofp-print.c > @@ -859,11 +859,14 @@ ofp_print_duration(struct ds *string, unsigned int sec, > unsigned int nsec) > ds_put_char(string, 's'); > } > > +/* Returns a string form of 'reason'. The return value is either a > statically > + * allocated constant string or the 'bufsize'-byte buffer 'reasonbuf'. > + * 'bufsize' should be at least OFP_FLOW_REMOVED_REASON_BUFSIZE. */ > +#define OFP_FLOW_REMOVED_REASON_BUFSIZE (INT_STRLEN(int) + 1) > static const char * > -ofp_flow_removed_reason_to_string(enum ofp_flow_removed_reason reason) > +ofp_flow_removed_reason_to_string(enum ofp_flow_removed_reason reason, > + char *reasonbuf, size_t bufsize) > { > - static char s[32]; > - > switch (reason) { > case OFPRR_IDLE_TIMEOUT: > return "idle"; > @@ -876,14 +879,15 @@ ofp_flow_removed_reason_to_string(enum > ofp_flow_removed_reason reason) > case OFPRR_EVICTION: > return "eviction"; > default: > - sprintf(s, "%d", (int) reason); > - return s; > + snprintf(reasonbuf, bufsize, "%d", (int) reason); > + return reasonbuf; > } > } > > static void > ofp_print_flow_removed(struct ds *string, const struct ofp_header *oh) > { > + char reasonbuf[OFP_FLOW_REMOVED_REASON_BUFSIZE]; > struct ofputil_flow_removed fr; > enum ofperr error; > > @@ -897,7 +901,8 @@ ofp_print_flow_removed(struct ds *string, const struct > ofp_header *oh) > match_format(&fr.match, string, fr.priority); > > ds_put_format(string, " reason=%s", > - ofp_flow_removed_reason_to_string(fr.reason)); > + ofp_flow_removed_reason_to_string(fr.reason, reasonbuf, > + sizeof reasonbuf)); > > if (fr.table_id != 255) { > ds_put_format(string, " table_id=%"PRIu8, fr.table_id); > @@ -1628,11 +1633,11 @@ ofp_print_nxt_set_packet_in_format(struct ds *string, > } > } > > +enum { OFP_PORT_REASON_BUFSIZE = INT_STRLEN(int) + 1 }; > static const char * > -ofp_port_reason_to_string(enum ofp_port_reason reason) > +ofp_port_reason_to_string(enum ofp_port_reason reason, > + char *reasonbuf, size_t bufsize) > { > - static char s[32]; > - > switch (reason) { > case OFPPR_ADD: > return "add"; > @@ -1644,8 +1649,8 @@ ofp_port_reason_to_string(enum ofp_port_reason reason) > return "modify"; > > default: > - sprintf(s, "%d", (int) reason); > - return s; > + snprintf(reasonbuf, bufsize, "%d", (int) reason); > + return reasonbuf; > } > } > > @@ -1679,7 +1684,12 @@ ofp_print_nxt_set_async_config(struct ds *string, > ds_put_cstr(string, " PORT_STATUS:"); > for (j = 0; j < 32; j++) { > if (nac->port_status_mask[i] & htonl(1u << j)) { > - ds_put_format(string, " %s", ofp_port_reason_to_string(j)); > + char reasonbuf[OFP_PORT_REASON_BUFSIZE]; > + const char *reason; > + > + reason = ofp_port_reason_to_string(j, reasonbuf, > + sizeof reasonbuf); > + ds_put_format(string, " %s", reason); > } > } > if (!nac->port_status_mask[i]) { > @@ -1690,8 +1700,12 @@ ofp_print_nxt_set_async_config(struct ds *string, > ds_put_cstr(string, " FLOW_REMOVED:"); > for (j = 0; j < 32; j++) { > if (nac->flow_removed_mask[i] & htonl(1u << j)) { > - ds_put_format(string, " %s", > - ofp_flow_removed_reason_to_string(j)); > + char reasonbuf[OFP_FLOW_REMOVED_REASON_BUFSIZE]; > + const char *reason; > + > + reason = ofp_flow_removed_reason_to_string(j, reasonbuf, > + sizeof reasonbuf); > + ds_put_format(string, " %s", reason); > } > } > if (!nac->flow_removed_mask[i]) { > @@ -1782,6 +1796,7 @@ ofp_print_nxst_flow_monitor_reply(struct ds *string, > ofpbuf_use_const(&b, oh, ntohs(oh->length)); > ofpbuf_use_stub(&ofpacts, ofpacts_stub, sizeof ofpacts_stub); > for (;;) { > + char reasonbuf[OFP_FLOW_REMOVED_REASON_BUFSIZE]; > struct ofputil_flow_update update; > struct match match; > int retval; > @@ -1804,7 +1819,9 @@ ofp_print_nxst_flow_monitor_reply(struct ds *string, > > case NXFME_DELETED: > ds_put_format(string, "DELETED reason=%s", > - ofp_flow_removed_reason_to_string(update.reason)); > + ofp_flow_removed_reason_to_string(update.reason, > + reasonbuf, > + sizeof > reasonbuf)); > break; > > case NXFME_MODIFIED: > -- > 1.7.2.5 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev