odp-util: Fix parsing of Ethertypes 0x8000 and above.
authorBen Pfaff <blp@nicira.com>
Thu, 18 Aug 2011 17:33:32 +0000 (10:33 -0700)
committerBen Pfaff <blp@nicira.com>
Thu, 18 Aug 2011 18:37:44 +0000 (11:37 -0700)
An existing comment in the function being updated explains the problem:

    * Many of the sscanf calls in this function use oversized destination
    * fields because some sscanf() implementations truncate the range of %i
    * directives, so that e.g. "%"SCNi16 interprets input of "0xfedc" as a
    * value of 0x7fff.  The other alternatives are to allow only a single
    * radix (e.g. decimal or hexadecimal) or to write more sophisticated
    * parsers.

lib/odp-util.c

index b4163805560e39ab2773a6834f55eeb703985027..00e4627b45487881399315cf48f3d8bde0a8c3c3 100644 (file)
@@ -480,10 +480,10 @@ parse_odp_key_attr(const char *s, struct ofpbuf *key)
     }
 
     {
-        uint16_t eth_type;
+        int eth_type;
         int n = -1;
 
-        if (sscanf(s, "eth_type(%"SCNi16")%n", &eth_type, &n) > 0 && n > 0) {
+        if (sscanf(s, "eth_type(%i)%n", &eth_type, &n) > 0 && n > 0) {
             nl_msg_put_be16(key, ODP_KEY_ATTR_ETHERTYPE, htons(eth_type));
             return n;
         }