diff options
author | Elliott Hughes <enh@google.com> | 2019-02-04 17:43:27 -0800 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2019-02-04 21:03:17 -0600 |
commit | d5ad47d000635aa69f2016bf641958c89fba26cc (patch) | |
tree | 411e4c75299ba9baba7724fb2183f6f2a9cf8d4b | |
parent | 02f220a9a6a8b358d18b26824ed3434cbdbbd75b (diff) | |
download | toybox-d5ad47d000635aa69f2016bf641958c89fba26cc.tar.gz |
sort -o: fix behavior when output file is one of the input files.
Bug: http://b/123902291
-rwxr-xr-x | tests/sort.test | 2 | ||||
-rw-r--r-- | toys/posix/sort.c | 7 |
2 files changed, 6 insertions, 3 deletions
diff --git a/tests/sort.test b/tests/sort.test index c71012f0..a40d1b0f 100755 --- a/tests/sort.test +++ b/tests/sort.test @@ -13,6 +13,8 @@ testing "stdin" "sort" "a\nb\nc\n" "" "b\na\nc\n" testing "numeric" "sort -n input" "1\n3\n010\n" "3\n1\n010\n" "" testing "reverse" "sort -r input" "wook\nwalrus\npoint\npabst\naargh\n" \ "point\nwook\npabst\naargh\nwalrus\n" "" +testing "sort -o" "sort input -o output && cat output" "a\nb\nc\n" "c\na\nb\n" "" +testing "sort -o same" "sort input -o input && cat input" "a\nb\nc\n" "c\na\nb\n" "" # Longish chunk of data re-used by the next few tests. The expected output # varies, but the input (this) is the same. diff --git a/toys/posix/sort.c b/toys/posix/sort.c index 6f5467e1..9433aef2 100644 --- a/toys/posix/sort.c +++ b/toys/posix/sort.c @@ -304,9 +304,6 @@ void sort_main(void) { int idx, fd = 1; - // Open output file if necessary. - if (TT.o) fd = xcreate(TT.o, O_CREAT|O_TRUNC|O_WRONLY, 0666); - // Parse -k sort keys. if (TT.k) { struct arg_list *arg; @@ -384,6 +381,10 @@ void sort_main(void) if (TT.linecount) TT.linecount = jdx+1; } + // Open output file if necessary. We can't do this until we've finished + // reading in case the output file is one of the input files. + if (TT.o) fd = xcreate(TT.o, O_CREAT|O_TRUNC|O_WRONLY, 0666); + // Output result for (idx = 0; idx<TT.linecount; idx++) { char *s = TT.lines[idx]; |