[dpdk-dev,v1] examples/ethtool: fix segfault querying non-PCI devices

Message ID 1480474049-3828-1-git-send-email-remy.horton@intel.com (mailing list archive)
State Accepted, archived
Delegated to: Thomas Monjalon
Headers

Checks

Context Check Description
checkpatch/checkpatch success coding style OK

Commit Message

Remy Horton Nov. 30, 2016, 2:47 a.m. UTC
  Doing a device information query on a non-PCI device such as
vhost was resulting in the dereferencing of a NULL pointer
(the absent PCI data), causing a segmentation fault.

Fixes: bda68ab9d1e7 ("examples/ethtool: add user-space ethtool sample application")

Signed-off-by: Remy Horton <remy.horton@intel.com>
---
 doc/guides/rel_notes/release_17_02.rst |  3 +++
 examples/ethtool/lib/rte_ethtool.c     | 13 +++++++++----
 2 files changed, 12 insertions(+), 4 deletions(-)
  

Comments

Thomas Monjalon Dec. 20, 2016, 3:11 p.m. UTC | #1
2016-11-30 10:47, Remy Horton:
> Doing a device information query on a non-PCI device such as
> vhost was resulting in the dereferencing of a NULL pointer
> (the absent PCI data), causing a segmentation fault.
> 
> Fixes: bda68ab9d1e7 ("examples/ethtool: add user-space ethtool sample application")
> 
> Signed-off-by: Remy Horton <remy.horton@intel.com>
[...]
> --- a/doc/guides/rel_notes/release_17_02.rst
> +++ b/doc/guides/rel_notes/release_17_02.rst
> @@ -70,6 +70,9 @@ Libraries
>  Examples
>  ~~~~~~~~
>  
> +   * **examples/ethtool Fixed crash with non-PCI devices.**
> +     Querying a non-PCI device was dereferencing non-existent PCI data
> +     resulting in a segmentation fault.

indentation fixed here

Applied, thanks
  

Patch

diff --git a/doc/guides/rel_notes/release_17_02.rst b/doc/guides/rel_notes/release_17_02.rst
index 3b65038..f471e49 100644
--- a/doc/guides/rel_notes/release_17_02.rst
+++ b/doc/guides/rel_notes/release_17_02.rst
@@ -70,6 +70,9 @@  Libraries
 Examples
 ~~~~~~~~
 
+   * **examples/ethtool Fixed crash with non-PCI devices.**
+     Querying a non-PCI device was dereferencing non-existent PCI data
+     resulting in a segmentation fault.
 
 Other
 ~~~~~
diff --git a/examples/ethtool/lib/rte_ethtool.c b/examples/ethtool/lib/rte_ethtool.c
index a1f91d4..6f0ce84 100644
--- a/examples/ethtool/lib/rte_ethtool.c
+++ b/examples/ethtool/lib/rte_ethtool.c
@@ -61,10 +61,15 @@  rte_ethtool_get_drvinfo(uint8_t port_id, struct ethtool_drvinfo *drvinfo)
 		dev_info.driver_name);
 	snprintf(drvinfo->version, sizeof(drvinfo->version), "%s",
 		rte_version());
-	snprintf(drvinfo->bus_info, sizeof(drvinfo->bus_info),
-		"%04x:%02x:%02x.%x",
-		dev_info.pci_dev->addr.domain, dev_info.pci_dev->addr.bus,
-		dev_info.pci_dev->addr.devid, dev_info.pci_dev->addr.function);
+	if (dev_info.pci_dev)
+		snprintf(drvinfo->bus_info, sizeof(drvinfo->bus_info),
+			"%04x:%02x:%02x.%x",
+			dev_info.pci_dev->addr.domain,
+			dev_info.pci_dev->addr.bus,
+			dev_info.pci_dev->addr.devid,
+			dev_info.pci_dev->addr.function);
+	else
+		snprintf(drvinfo->bus_info, sizeof(drvinfo->bus_info), "N/A");
 
 	memset(&reg_info, 0, sizeof(reg_info));
 	rte_eth_dev_get_reg_info(port_id, &reg_info);