From: Zbigniew Jędrzejewski-Szmek Date: Thu, 1 Jan 2015 17:00:59 +0000 (-0500) Subject: networkctl: avoid potential use of unitialized variables X-Git-Tag: v219~722 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=ba52f15a5827b7ae8c55c53cdcc5bb9a6abbf0db networkctl: avoid potential use of unitialized variables Those values are based on a file we read from disk, so we should verify everything we receive, and make sure everything we print is sensible. Also, print fractional seconds for TTL. --- diff --git a/src/network/networkctl.c b/src/network/networkctl.c index f85058c27..f7e300b44 100644 --- a/src/network/networkctl.c +++ b/src/network/networkctl.c @@ -898,7 +898,7 @@ static int link_lldp_status(int argc, char *argv[], void *userdata) { _cleanup_free_ LinkInfo *links = NULL; const char *state, *word; - usec_t time, until, ttl; + double ttl = -1; uint32_t capability; int i, r, c, j; size_t ll; @@ -964,13 +964,19 @@ static int link_lldp_status(int argc, char *argv[], void *userdata) { return -ENOMEM; } else if (streq(a, "_TTL")) { + long long unsigned x; + usec_t time; - time = now(CLOCK_BOOTTIME); - - sscanf(b, USEC_FMT, &until); + r = safe_atollu(b, &x); + if (r < 0 || (usec_t) x != x) + return log_warning_errno(r < 0 ? r : ERANGE, + "Failed to parse TTL \"%s\": %m", b); - ttl = (until - time) / USEC_PER_SEC; + time = now(CLOCK_BOOTTIME); + if (x < time) + continue; + ttl = (double) (x - time) / USEC_PER_SEC; } else if (streq(a, "_CAP")) { sscanf(b, "%x", &capability); @@ -980,8 +986,11 @@ static int link_lldp_status(int argc, char *argv[], void *userdata) { } - if (until > time) { - printf("%10s %24s %16s %16"PRIu64" %16s\n", links[i].name, chassis, port, ttl, cap); + if (ttl >= 0) { + printf("%10s %24s %16s %16f %16s\n", + links[i].name, + strna(chassis), strna(port), + ttl, cap); j++; } }