netdev-linux: Avoid fiddling with indeterminate data.
authorBen Pfaff <blp@nicira.com>
Thu, 11 Feb 2010 18:34:45 +0000 (10:34 -0800)
committerBen Pfaff <blp@nicira.com>
Thu, 11 Feb 2010 18:34:45 +0000 (10:34 -0800)
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

index ccc3f845c9c2a96afcdf5d93171936d498c29911..6d46b09e923a0c7f8aecee416cdcfad26f2e626e 100644 (file)
@@ -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;