This makes it accept the same syntax as parse_NOTE(), so that that function can be simplified. In an upcoming commit a second action will also be able to take advantage of the same feature.
Signed-off-by: Ben Pfaff <b...@ovn.org> --- v3: New patch. v3->v4: Fix use-after-free error. lib/ofp-actions.c | 34 +++++++++------------------------- lib/ofpbuf.c | 12 ++++++------ 2 files changed, 15 insertions(+), 31 deletions(-) diff --git a/lib/ofp-actions.c b/lib/ofp-actions.c index 9b75526..24f18d9 100644 --- a/lib/ofp-actions.c +++ b/lib/ofp-actions.c @@ -4401,31 +4401,15 @@ static char * OVS_WARN_UNUSED_RESULT parse_NOTE(const char *arg, struct ofpbuf *ofpacts, enum ofputil_protocol *usable_protocols OVS_UNUSED) { - struct ofpact_note *note; - - note = ofpact_put_NOTE(ofpacts); - while (*arg != '\0') { - uint8_t byte; - bool ok; - - if (*arg == '.') { - arg++; - } - if (*arg == '\0') { - break; - } - - byte = hexits_value(arg, 2, &ok); - if (!ok) { - return xstrdup("bad hex digit in `note' argument"); - } - ofpbuf_put(ofpacts, &byte, 1); - - note = ofpacts->header; - note->length++; - - arg += 2; - } + size_t start_ofs = ofpacts->size; + ofpact_put_NOTE(ofpacts); + arg = ofpbuf_put_hex(ofpacts, arg, NULL); + if (arg[0]) { + return xstrdup("bad hex digit in `note' argument"); + } + struct ofpact_note *note = ofpbuf_at_assert(ofpacts, start_ofs, + sizeof *note); + note->length = ofpacts->size - (start_ofs + sizeof *note); ofpact_finish(ofpacts, ¬e->ofpact); return NULL; } diff --git a/lib/ofpbuf.c b/lib/ofpbuf.c index c190f8b..a3c4da4 100644 --- a/lib/ofpbuf.c +++ b/lib/ofpbuf.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc. + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2016 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -389,10 +389,10 @@ ofpbuf_put(struct ofpbuf *b, const void *p, size_t size) return dst; } -/* Parses as many pairs of hex digits as possible (possibly separated by - * spaces) from the beginning of 's', appending bytes for their values to 'b'. - * Returns the first character of 's' that is not the first of a pair of hex - * digits. If 'n' is nonnull, stores the number of bytes added to 'b' in +/* Parses as many pairs of hex digits as possible (possibly separated by spaces + * or periods) from the beginning of 's', appending bytes for their values to + * 'b'. Returns the first character of 's' that is not the first of a pair of + * hex digits. If 'n' is nonnull, stores the number of bytes added to 'b' in * '*n'. */ char * ofpbuf_put_hex(struct ofpbuf *b, const char *s, size_t *n) @@ -402,7 +402,7 @@ ofpbuf_put_hex(struct ofpbuf *b, const char *s, size_t *n) uint8_t byte; bool ok; - s += strspn(s, " \t\r\n"); + s += strspn(s, " .\t\r\n"); byte = hexits_value(s, 2, &ok); if (!ok) { if (n) { -- 2.1.3 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev