>From 9a2e8ac489d7f7b2af4e1468f6174db9106eb9e4 Mon Sep 17 00:00:00 2001 From: Bernhard Voelker Date: Thu, 14 Apr 2016 12:39:28 +0200 Subject: [PATCH 2/2] seq: do not allow NaN arguments * src/seq.c (isnan): Define macro. (scan_arg): Add check if the given argument is NaN, and exit with a proper error diagnostic in such a case. (usage): Document it. * tests/misc/seq.pl: Add tests. * doc/coreutils.texi (seq invocation): Document the change. * NEWS (Changes in behavior): Mention the change. --- NEWS | 3 ++- doc/coreutils.texi | 1 + src/seq.c | 14 ++++++++++++-- tests/misc/seq.pl | 17 +++++++++++++++++ 4 files changed, 32 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 13af702..4cb5caf 100644 --- a/NEWS +++ b/NEWS @@ -17,7 +17,8 @@ GNU coreutils NEWS -*- outline -*- ** Changes in behavior - seq no longer accepts 0 value as increment argument. + seq no longer accepts 0 value as increment, and now also rejects NaN + values for any argument. stat now outputs nanosecond information for time stamps even if they are out of localtime range. diff --git a/doc/coreutils.texi b/doc/coreutils.texi index 6b70635..5630201 100644 --- a/doc/coreutils.texi +++ b/doc/coreutils.texi @@ -17424,6 +17424,7 @@ The sequence of numbers ends when the sum of the current number and so @code{seq 1 10 10} only produces @samp{1}. @var{increment} must not be @samp{0}; use @command{yes} to get repeated output of a constant number. address@hidden, @var{increment} and @var{last} must not be @code{NaN}. Floating-point numbers may be specified. @xref{Floating point}. The program accepts the following options. Also see @ref{Common options}. diff --git a/src/seq.c b/src/seq.c index 91cf625..de92bc2 100644 --- a/src/seq.c +++ b/src/seq.c @@ -27,11 +27,14 @@ #include "quote.h" #include "xstrtod.h" -/* Roll our own isfinite rather than using , so that we don't +/* Roll our own isfinite/isnan rather than using , so that we don't have to worry about linking -lm just for isfinite. */ #ifndef isfinite # define isfinite(x) ((x) * 0 == 0) #endif +#ifndef isnan +# define isnan(x) ((x) != (x)) +#endif /* The official name of this program (e.g., no 'g' prefix). */ #define PROGRAM_NAME "seq" @@ -92,7 +95,7 @@ INCREMENT would become greater than LAST.\n\ FIRST, INCREMENT, and LAST are interpreted as floating point values.\n\ INCREMENT is usually positive if FIRST is smaller than LAST, and\n\ INCREMENT is usually negative if FIRST is greater than LAST.\n\ -INCREMENT must not be 0.\n\ +INCREMENT must not be 0; none of FIRST, INCREMENT and LAST may be NaN.\n\ "), stdout); fputs (_("\ FORMAT must be suitable for printing one argument of type 'double';\n\ @@ -144,6 +147,13 @@ scan_arg (const char *arg) usage (EXIT_FAILURE); } + if (isnan (ret.value)) + { + error (0, 0, _("invalid %s argument: %s"), quote_n (0, "not-a-number"), + quote_n (1, arg)); + usage (EXIT_FAILURE); + } + /* We don't output spaces or '+' so don't include in width */ while (isspace (to_uchar (*arg)) || *arg == '+') arg++; diff --git a/tests/misc/seq.pl b/tests/misc/seq.pl index ac0664f..130bbf3 100755 --- a/tests/misc/seq.pl +++ b/tests/misc/seq.pl @@ -26,6 +26,7 @@ use strict; my $prog = 'seq'; my $try_help = "Try '$prog --help' for more information.\n"; my $err_inc_zero = "seq: invalid Zero increment value: '0'\n".$try_help; +my $err_nan_arg = "seq: invalid 'not-a-number' argument: 'nan'\n".$try_help; my $locale = $ENV{LOCALE_FR_UTF8}; ! defined $locale || $locale eq 'none' @@ -161,6 +162,22 @@ my @Tests = {ERR_SUBST => 's/0.0/0/'}], ['inc-zero-4', qw(1 -0.0e-10 10), {EXIT => 1},{ERR => $err_inc_zero}, {ERR_SUBST => 's/-0\.0e-10/0/'}], + + # Ensure NaN arguments rejected. + ['nan-first-1', qw(nan), {EXIT => 1}, {ERR => $err_nan_arg}], + ['nan-first-2', qw(NaN 2), {EXIT => 1}, {ERR => $err_nan_arg}, + {ERR_SUBST => 's/NaN/nan/'}], + ['nan-first-3', qw(nan 1 2), {EXIT => 1}, {ERR => $err_nan_arg}], + ['nan-first-4', qw(-- -nan), {EXIT => 1}, {ERR => $err_nan_arg}, + {ERR_SUBST => 's/-nan/nan/'}], + ['nan-inc-1', qw(1 nan 2), {EXIT => 1}, {ERR => $err_nan_arg}], + ['nan-inc-2', qw(1 -NaN 2), {EXIT => 1}, {ERR => $err_nan_arg}, + {ERR_SUBST => 's/-NaN/nan/'}], + ['nan-last-1', qw(1 1 nan), {EXIT => 1}, {ERR => $err_nan_arg}], + ['nan-last-2', qw(1 NaN), {EXIT => 1}, {ERR => $err_nan_arg}, + {ERR_SUBST => 's/NaN/nan/'}], + ['nan-last-3', qw(0 -1 -NaN), {EXIT => 1}, {ERR => $err_nan_arg}, + {ERR_SUBST => 's/-NaN/nan/'}], ); # Append a newline to each entry in the OUT array. -- 2.1.4