implemented additional error condition for openbsd netstat in case the 
interface could not be found in the interface list or if_data is not
readable.

---
 components/netspeeds.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/components/netspeeds.c b/components/netspeeds.c
index 9315fef..c846a2c 100644
--- a/components/netspeeds.c
+++ b/components/netspeeds.c
@@ -64,6 +64,7 @@
                uint64_t rxbytes = 0;
                const char *rxs;
                extern const unsigned int interval;
+               char if_ok = 0;
 
                if (getifaddrs(&ifal) == -1) {
                        warn("getifaddrs failed");
@@ -72,10 +73,14 @@
                for (ifa = ifal; ifa; ifa = ifa->ifa_next) {
                        if (!strcmp(ifa->ifa_name, interface) &&
                           (ifd = (struct if_data *)ifa->ifa_data)) {
-                               rxbytes += ifd->ifi_ibytes;
+                               rxbytes += ifd->ifi_ibytes, if_ok = 1;
                        }
                }
                freeifaddrs(ifal);
+               if (!if_ok) {
+                       warn("reading 'if_data' failed");
+                       return NULL;
+               }
 
                rxs = oldrxbytes ? fmt_scaled((rxbytes - oldrxbytes) /
                                              interval * 1000) : NULL;
@@ -91,6 +96,7 @@
                uint64_t txbytes = 0;
                const char *txs;
                extern const unsigned int interval;
+               char if_ok = 0;
 
                if (getifaddrs(&ifal) == -1) {
                        warn("getifaddrs failed");
@@ -99,10 +105,14 @@
                for (ifa = ifal; ifa; ifa = ifa->ifa_next) {
                        if (!strcmp(ifa->ifa_name, interface) &&
                           (ifd = (struct if_data *)ifa->ifa_data)) {
-                               txbytes += ifd->ifi_obytes;
+                               txbytes += ifd->ifi_obytes, if_ok = 1;
                        }
                }
                freeifaddrs(ifal);
+               if (!if_ok) {
+                       warn("reading 'if_data' failed");
+                       return NULL;
+               }
 
                txs = oldtxbytes ? fmt_scaled((txbytes - oldtxbytes) /
                                              interval * 1000) : NULL;
-- 
2.16.2


Reply via email to