Thanks for the review. You are right about the leak (thank you!); I fixed it. I applied this to master.
On Fri, Feb 16, 2018 at 09:59:25AM -0800, Yifeng Sun wrote: > It seems for me that buffer is leaked for the below line: > > buffer = ds_steal_cstr(&line); > > Or it doesn't matter since this is a utility function? > > Other than that, this patch looks good to me. > > Reviewed-by: Yifeng Sun <pkusunyif...@gmail.com> > > On Wed, Feb 14, 2018 at 2:40 PM, Ben Pfaff <b...@ovn.org> wrote: > > > Occasionally someone sends me raw OpenFlow data in a file and this saves > > time converting it to hex. > > > > Signed-off-by: Ben Pfaff <b...@ovn.org> > > --- > > utilities/ovs-ofctl.c | 57 +++++++++++++++++++++++++++++- > > --------------------- > > 1 file changed, 33 insertions(+), 24 deletions(-) > > > > diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c > > index e47891ddb353..27a9fc431397 100644 > > --- a/utilities/ovs-ofctl.c > > +++ b/utilities/ovs-ofctl.c > > @@ -153,6 +153,9 @@ static int show_stats = 1; > > /* --pcap: Makes "compose-packet" print a pcap on stdout. */ > > static int print_pcap = 0; > > > > +/* --raw: Makes "ofp-print" read binary data from stdin. */ > > +static int raw = 0; > > + > > static const struct ovs_cmdl_command *get_all_commands(void); > > > > OVS_NO_RETURN static void usage(void); > > @@ -239,6 +242,7 @@ parse_options(int argc, char *argv[]) > > {"color", optional_argument, NULL, OPT_COLOR}, > > {"may-create", no_argument, NULL, OPT_MAY_CREATE}, > > {"pcap", no_argument, &print_pcap, 1}, > > + {"raw", no_argument, &raw, 1}, > > {"read-only", no_argument, NULL, OPT_READ_ONLY}, > > DAEMON_LONG_OPTIONS, > > OFP_VERSION_LONG_OPTIONS, > > @@ -4629,43 +4633,48 @@ ofctl_encode_error_reply(struct ovs_cmdl_context > > *ctx) > > ofpbuf_delete(reply); > > } > > > > -/* "ofp-print HEXSTRING [VERBOSITY]": Converts the hex digits in > > HEXSTRING into > > - * binary data, interpreting them as an OpenFlow message, and prints the > > - * OpenFlow message on stdout, at VERBOSITY (level 2 by default). > > +/* Usage: > > + * ofp-print HEXSTRING [VERBOSITY] > > + * ofp-print - [VERBOSITY] < HEXSTRING_FILE > > + * ofp-print --raw - [VERBOSITY] < RAW_FILE > > * > > - * Alternative usage: "ofp-print [VERBOSITY] - < HEXSTRING_FILE", where > > - * HEXSTRING_FILE contains the HEXSTRING. */ > > + * Converts the hex digits in HEXSTRING into binary data, interpreting > > them as > > + * an OpenFlow message, and prints the OpenFlow message on stdout, at > > VERBOSITY > > + * (level 2 by default). With -, hex data is read from HEXSTRING_FILE, > > and > > + * with --raw -, raw binary data is read from RAW_FILE. */ > > static void > > ofctl_ofp_print(struct ovs_cmdl_context *ctx) > > { > > - struct ofpbuf packet; > > - char *buffer; > > - int verbosity = 2; > > - struct ds line; > > + int verbosity = ctx->argc > 2 ? atoi(ctx->argv[2]) : 2; > > > > - ds_init(&line); > > + struct ofpbuf packet; > > + ofpbuf_init(&packet, 0); > > > > - if (!strcmp(ctx->argv[ctx->argc-1], "-")) { > > - if (ds_get_line(&line, stdin)) { > > - VLOG_FATAL("Failed to read stdin"); > > + char *buffer = NULL; > > + if (!strcmp(ctx->argv[1], "-")) { > > + if (raw) { > > + for (;;) { > > + int c = getchar(); > > + if (c == EOF) { > > + break; > > + } > > + ofpbuf_put(&packet, &c, 1); > > + } > > + } else { > > + struct ds line = DS_EMPTY_INITIALIZER; > > + if (ds_get_line(&line, stdin)) { > > + VLOG_FATAL("Failed to read stdin"); > > + } > > + buffer = ds_steal_cstr(&line); > > } > > - > > - buffer = line.string; > > - verbosity = ctx->argc > 2 ? atoi(ctx->argv[1]) : verbosity; > > - } else if (ctx->argc > 2) { > > - buffer = ctx->argv[1]; > > - verbosity = atoi(ctx->argv[2]); > > - } else { > > + } else { > > buffer = ctx->argv[1]; > > } > > - > > - ofpbuf_init(&packet, strlen(buffer) / 2); > > - if (ofpbuf_put_hex(&packet, buffer, NULL)[0] != '\0') { > > + if (buffer && ofpbuf_put_hex(&packet, buffer, NULL)[0] != '\0') { > > ovs_fatal(0, "trailing garbage following hex bytes"); > > } > > ofp_print(stdout, packet.data, packet.size, NULL, NULL, verbosity); > > ofpbuf_uninit(&packet); > > - ds_destroy(&line); > > } > > > > /* "encode-hello BITMAP...": Encodes each BITMAP as an OpenFlow hello > > message > > -- > > 2.16.1 > > > > _______________________________________________ > > dev mailing list > > d...@openvswitch.org > > https://mail.openvswitch.org/mailman/listinfo/ovs-dev > > _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev