From b62aeed2ab06ecb9a3b3a82dc42ebfc2703ef52f Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Thu, 11 Feb 2010 10:34:45 -0800 Subject: [PATCH] netdev-linux: Avoid fiddling with indeterminate data. If we are using netlink to get stats and get_ifindex() fails, then for an internal network device we will then swap around a bunch of indeterminate (uninitialized) data values. That won't hurt anything--the caller will still set them to all-1-bits due to the error--but it still seems wrong. So this commit avoid it. Found using Clang (http://clang-analyzer.llvm.org/). --- lib/netdev-linux.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index ccc3f845..6d46b09e 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -1223,9 +1223,7 @@ netdev_linux_get_stats(const struct netdev *netdev_, COVERAGE_INC(netdev_get_stats); if (!(netdev_dev->cache_valid & VALID_IS_INTERNAL)) { - netdev_dev->is_internal = !strcmp(netdev_get_type(netdev_), - "tap"); - + netdev_dev->is_internal = !strcmp(netdev_get_type(netdev_), "tap"); if (!netdev_dev->is_internal) { struct ethtool_drvinfo drvinfo; @@ -1266,7 +1264,7 @@ netdev_linux_get_stats(const struct netdev *netdev_, * will appear to be swapped relative to the other ports since we are the * one sending the data, not a remote computer. For consistency, we swap * them back here. */ - if (netdev_dev->is_internal) { + if (!error && netdev_dev->is_internal) { stats->rx_packets = raw_stats.tx_packets; stats->tx_packets = raw_stats.rx_packets; stats->rx_bytes = raw_stats.tx_bytes; -- 2.30.2