From 1c462d47a0bc92f9f57af223456df53169acf3fe Mon Sep 17 00:00:00 2001 From: Ron Yorston Date: Wed, 19 Feb 2020 11:01:39 +0000 Subject: [PATCH] xargs: restore correct behaviour of -n option Since commit 1ff7002b1 (xargs: fix handling of quoted arguments, closes 11441) the -n option hasn't worked properly: $ echo 1 2 3 | xargs -n 1 echo 1 2 3 $ Because state is now remembered between calls to process_stdin() it's necessary to update the state before any premature return. Signed-off-by: Ron Yorston Signed-off-by: Denys Vlasenko --- findutils/xargs.c | 2 +- testsuite/xargs.tests | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/findutils/xargs.c b/findutils/xargs.c index 4fb306bb8..ff04bfe7c 100644 --- a/findutils/xargs.c +++ b/findutils/xargs.c @@ -315,6 +315,7 @@ static char* FAST_FUNC process_stdin(int n_max_chars, int n_max_arg, char *buf) } } if (state == SPACE) { /* word's delimiter or EOF detected */ + state = NORM; if (q) { bb_error_msg_and_die("unmatched %s quote", q == '\'' ? "single" : "double"); @@ -335,7 +336,6 @@ static char* FAST_FUNC process_stdin(int n_max_chars, int n_max_arg, char *buf) if (n_max_arg == 0) { goto ret; } - state = NORM; } if (p == buf) { goto ret; diff --git a/testsuite/xargs.tests b/testsuite/xargs.tests index 855b33bc2..159f1ff69 100755 --- a/testsuite/xargs.tests +++ b/testsuite/xargs.tests @@ -48,6 +48,17 @@ testing "xargs argument line too long" \ "seq 10000 99999 | sed -e 's/^/\"/' -e 's/$/\"/' | xargs echo | grep -o 99999; echo \$?" \ "99999\n0\n" \ "" "" + +testing "xargs -n1" \ + "xargs -n1 echo" \ + "1\n2\n3\n4\n5\n" \ + "" "1 2 3 4 5\n" + +testing "xargs -n2" \ + "xargs -n2 echo" \ + "1 2\n3 4\n5\n" \ + "" "1 2 3 4 5\n" + SKIP= exit $FAILCOUNT