From: Ben Pfaff Date: Thu, 18 Aug 2011 17:33:32 +0000 (-0700) Subject: odp-util: Fix parsing of Ethertypes 0x8000 and above. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fac2e5163cb349ec33d8d2bdda2e73f35e50d4d5;p=openvswitch odp-util: Fix parsing of Ethertypes 0x8000 and above. 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. --- diff --git a/lib/odp-util.c b/lib/odp-util.c index b4163805..00e4627b 100644 --- a/lib/odp-util.c +++ b/lib/odp-util.c @@ -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", ð_type, &n) > 0 && n > 0) { + if (sscanf(s, "eth_type(%i)%n", ð_type, &n) > 0 && n > 0) { nl_msg_put_be16(key, ODP_KEY_ATTR_ETHERTYPE, htons(eth_type)); return n; }