From 3a7719015d1c33f326b613449957a54855c939de Mon Sep 17 00:00:00 2001 From: ridiculousfish Date: Sun, 12 Jun 2016 02:16:46 -0700 Subject: Don't allow specifying an fd with a caret redirection For example, an argument 12345^ is a real argument, not a redirection There's no reason to use ^ here instead of >, and it's annoying to git users. Fixes #1873 --- src/tokenizer.cpp | 5 +++-- tests/test1.in | 3 +++ tests/test1.out | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/tokenizer.cpp b/src/tokenizer.cpp index 7357fd35..8e0bc590 100644 --- a/src/tokenizer.cpp +++ b/src/tokenizer.cpp @@ -383,10 +383,11 @@ static size_t read_redirection_or_fd_pipe(const wchar_t *buff, } } } - + // Either way we should have ended on the redirection character itself like '>'. + // Don't allow an fd with a caret redirection - see #1873 wchar_t redirect_char = buff[idx++]; // note increment of idx - if (redirect_char == L'>' || redirect_char == L'^') { + if (redirect_char == L'>' || (redirect_char == L'^' && idx == 1)) { redirection_mode = TOK_REDIRECT_OUT; if (buff[idx] == redirect_char) { // Doubled up like ^^ or >>. That means append. diff --git a/tests/test1.in b/tests/test1.in index ff6075cc..6c3ba956 100644 --- a/tests/test1.in +++ b/tests/test1.in @@ -104,6 +104,9 @@ echo Test 5 $sta echo Test redirections begin ; echo output ; echo errput 1>&2 ; end 2>&1 | tee ../test/temp/tee_test.txt ; cat ../test/temp/tee_test.txt +# Test that trailing ^ doesn't trigger redirection, see #1873 +echo caret_no_redirect 12345^ + # Verify that we can pipe something other than stdout # The first line should be printed, since we output to stdout but pipe stderr to /dev/null # The second line should not be printed, since we output to stderr and pipe it to /dev/null diff --git a/tests/test1.out b/tests/test1.out index 26251a3b..1b5eeade 100644 --- a/tests/test1.out +++ b/tests/test1.out @@ -25,6 +25,7 @@ errput output errput output +caret_no_redirect 12345^ is_stdout abc\ndef abc -- cgit v1.2.3