From b83a2df1c519108bfff96f599ea91e4ba129c716 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Mauricio=20V=C3=A1squez?= Date: Tue, 23 Feb 2016 23:06:37 +0100 Subject: [PATCH] lib/netdev-dpdk: make device name parsing more robust Current implementation of dpdk_dev_parse_name does not perform a robust error handling, port names as "dpdkr" and "dpdkr1x" are considered valid. With this patch only positive port numbers in decimal notation are considered valid. Signed-off-by: Mauricio Vasquez B Signed-off-by: Daniele Di Proietto --- lib/netdev-dpdk.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index 4123f4063..f94e0d4b0 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -188,7 +188,7 @@ struct dpdk_ring { /* For the client rings */ struct rte_ring *cring_tx; struct rte_ring *cring_rx; - int user_port_id; /* User given port no, parsed from port name */ + unsigned int user_port_id; /* User given port no, parsed from port name */ int eth_port_id; /* ethernet device port id */ struct ovs_list list_node OVS_GUARDED_BY(dpdk_mutex); }; @@ -635,6 +635,8 @@ unlock: return err; } +/* dev_name must be the prefix followed by a positive decimal number. + * (no leading + or - signs are allowed) */ static int dpdk_dev_parse_name(const char dev_name[], const char prefix[], unsigned int *port_no) @@ -646,8 +648,12 @@ dpdk_dev_parse_name(const char dev_name[], const char prefix[], } cport = dev_name + strlen(prefix); - *port_no = strtol(cport, NULL, 0); /* string must be null terminated */ - return 0; + + if (str_to_uint(cport, 10, port_no)) { + return 0; + } else { + return ENODEV; + } } static int -- 2.20.1