[ovs-dev] [PATCH v4] ofpbuf: Make ofpbuf_put_hex() accept period between hex bytes also.

Ben Pfaff blp at ovn.org
Wed Feb 10 23:56:08 UTC 2016


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 <blp at 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, &note->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




More information about the dev mailing list