From 279fb135892ad0cf2764a220ed8f660dee97c608 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Thu, 25 Jul 2013 09:48:36 -0700 Subject: [PATCH] meta-flow: Be pickier about format of Ethernet addresses. Otherwise, input with invalid trailing data was accepted, such as input that had 7 colon-separated segments instead of 6. Signed-off-by: Ben Pfaff Acked-by: Andy Zhou --- lib/meta-flow.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/lib/meta-flow.c b/lib/meta-flow.c index 8f67b94c6..11fdfaa2f 100644 --- a/lib/meta-flow.c +++ b/lib/meta-flow.c @@ -2117,20 +2117,25 @@ mf_from_ethernet_string(const struct mf_field *mf, const char *s, uint8_t mac[ETH_ADDR_LEN], uint8_t mask[ETH_ADDR_LEN]) { - ovs_assert(mf->n_bytes == ETH_ADDR_LEN); + int n; - switch (sscanf(s, ETH_ADDR_SCAN_FMT"/"ETH_ADDR_SCAN_FMT, - ETH_ADDR_SCAN_ARGS(mac), ETH_ADDR_SCAN_ARGS(mask))){ - case ETH_ADDR_SCAN_COUNT * 2: - return NULL; + ovs_assert(mf->n_bytes == ETH_ADDR_LEN); - case ETH_ADDR_SCAN_COUNT: + n = -1; + if (sscanf(s, ETH_ADDR_SCAN_FMT"%n", ETH_ADDR_SCAN_ARGS(mac), &n) > 0 + && n == strlen(s)) { memset(mask, 0xff, ETH_ADDR_LEN); return NULL; + } - default: - return xasprintf("%s: invalid Ethernet address", s); + n = -1; + if (sscanf(s, ETH_ADDR_SCAN_FMT"/"ETH_ADDR_SCAN_FMT"%n", + ETH_ADDR_SCAN_ARGS(mac), ETH_ADDR_SCAN_ARGS(mask), &n) > 0 + && n == strlen(s)) { + return NULL; } + + return xasprintf("%s: invalid Ethernet address", s); } static char * -- 2.43.0