On 01/09/16 10:13, Luigi Tarenga wrote:
hi,
I just find a problem in the dash distributed with arch linux.
I didn't tested from dash source but the bug can be easily
checked:
dash 0.5.9-1
$ echo one two three
one two three
$
$ echo -n one two three
one$
Yikes.
with -n option it stop after printing one more parameter...
do you have the same problem or it's caused by a patch in arch?
That's caused by <http://www.spinics.net/lists/dash/msg00942.html>, not
by Arch. It's scary that this has gone totally unnoticed for more than a
year.
While the original code implementing the echo command was overly
complicated, the simplified version does not do the right thing, as you
noticed.
Here's another attempt at a simplified implementation.
Luigi
diff --git a/src/bltin/printf.c b/src/bltin/printf.c
index 9673e10..b7b6d68 100644
--- a/src/bltin/printf.c
+++ b/src/bltin/printf.c
@@ -447,16 +447,20 @@ echocmd(int argc, char **argv)
nonl = *++argv ? equal(*argv, "-n") : 0;
argv += nonl;
- do {
- int c;
+ if (*argv) {
+ for (;;) {
+ if (print_escape_str("%s", NULL, NULL, *argv))
+ return 0;
+
+ if (!*++argv)
+ break;
+
+ out1c(' ');
+ }
+ }
- if (likely(*argv))
- nonl += print_escape_str("%s", NULL, NULL, *argv++);
- if (nonl > 0)
- break;
+ if (!nonl)
+ out1c('\n');
- c = *argv ? ' ' : '\n';
- out1c(c);
- } while (*argv);
return 0;
}