From fd007d6d1df1714bda1338d8423c8c72238a6a14 Mon Sep 17 00:00:00 2001 From: Craig Small Date: Sat, 8 Aug 2015 21:04:01 +1000 Subject: [PATCH] free: Parse -s option correctly. If the -s option was the first option on the command line, free would report seconds argument failed. This only appeared on the Debian free, not the one in git. Closer examination revealed that if a valid float string is given to strtof() it doesn't set errno to 0, but just leaves it alone. As we are explicitly testing errno for overflows, this means the previous errno change is picked up here. The simple answer is to set errno to 0 before calling strtof(). References: https://bugs.debian/org/733758 https://enc.com.au/2015/08/08/be-careful-with-errno/ --- NEWS | 1 + free.c | 1 + 2 files changed, 2 insertions(+) diff --git a/NEWS b/NEWS index a0283480..af985014 100644 --- a/NEWS +++ b/NEWS @@ -12,6 +12,7 @@ procps-ng-NEXT * top once again will fully honor a saved rcfile, without requiring --disable-modern-top. Debian #762928, #762947 * vmstat: Not crash if partition appears before disk Debian #736628 + * free: -s without -c works Debian #733758 procps-ng-3.3.10 ---------------- diff --git a/free.c b/free.c index b19e07ff..6c72138c 100644 --- a/free.c +++ b/free.c @@ -323,6 +323,7 @@ int main(int argc, char **argv) break; case 's': flags |= FREE_REPEAT; + errno = 0; args.repeat_interval = (1000000 * strtof(optarg, &endptr)); if (errno || optarg == endptr || (endptr && *endptr)) xerrx(EXIT_FAILURE, _("seconds argument `%s' failed"), optarg);