diff options
Diffstat (limited to 'user/gitlab-runner/posix-shell-escape.patch')
-rw-r--r-- | user/gitlab-runner/posix-shell-escape.patch | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/user/gitlab-runner/posix-shell-escape.patch b/user/gitlab-runner/posix-shell-escape.patch new file mode 100644 index 000000000..b454141ed --- /dev/null +++ b/user/gitlab-runner/posix-shell-escape.patch @@ -0,0 +1,139 @@ +--- gitlab-runner-v12.1.0/helpers/shell_escape.go 2019-07-19 12:13:32.000000000 +0000 ++++ gitlab-runner-v12.1.0/helpers/shell_escape.go 2020-04-26 23:12:59.813309281 +0000 +@@ -4,7 +4,6 @@ package helpers + + import ( + "bytes" +- "encoding/hex" + "strings" + ) + +@@ -13,35 +12,10 @@ import ( + */ + + const ( +- ACK = 6 +- TAB = 9 +- LF = 10 +- CR = 13 +- US = 31 +- SPACE = 32 +- AMPERSTAND = 38 + SINGLE_QUOTE = 39 +- PLUS = 43 +- NINE = 57 +- QUESTION = 63 +- LOWERCASE_Z = 90 +- OPEN_BRACKET = 91 + BACKSLASH = 92 +- UNDERSCORE = 95 +- CLOSE_BRACKET = 93 +- BACKTICK = 96 +- TILDA = 126 +- DEL = 127 + ) + +-// ShellEscape is taken from https://github.com/solidsnack/shell-escape/blob/master/Text/ShellEscape/Bash.hs +-/* +-A Bash escaped string. The strings are wrapped in @$\'...\'@ if any +-bytes within them must be escaped; otherwise, they are left as is. +-Newlines and other control characters are represented as ANSI escape +-sequences. High bytes are represented as hex codes. Thus Bash escaped +-strings will always fit on one line and never contain non-ASCII bytes. +-*/ + func ShellEscape(str string) string { + if str == "" { + return "''" +@@ -50,85 +24,20 @@ func ShellEscape(str string) string { + out := bytes.NewBuffer(make([]byte, 0, len(str)*2)) + i := 0 + l := len(in) +- escape := false +- +- hex := func(char byte) { +- escape = true +- +- data := []byte{BACKSLASH, 'x', 0, 0} +- hex.Encode(data[2:], []byte{char}) +- out.Write(data) +- } +- +- backslash := func(char byte) { +- escape = true +- out.Write([]byte{BACKSLASH, char}) +- } +- +- escaped := func(str string) { +- escape = true +- out.WriteString(str) +- } +- +- quoted := func(char byte) { +- escape = true +- out.WriteByte(char) +- } +- +- literal := func(char byte) { +- out.WriteByte(char) +- } + ++ out.WriteByte(SINGLE_QUOTE) + for i < l { + char := in[i] +- switch { +- case char == TAB: +- escaped(`\t`) +- case char == LF: +- escaped(`\n`) +- case char == CR: +- escaped(`\r`) +- case char <= US: +- hex(char) +- case char <= AMPERSTAND: +- quoted(char) +- case char == SINGLE_QUOTE: +- backslash(char) +- case char <= PLUS: +- quoted(char) +- case char <= NINE: +- literal(char) +- case char <= QUESTION: +- quoted(char) +- case char <= LOWERCASE_Z: +- literal(char) +- case char == OPEN_BRACKET: +- quoted(char) +- case char == BACKSLASH: +- backslash(char) +- case char <= CLOSE_BRACKET: +- quoted(char) +- case char == UNDERSCORE: +- literal(char) +- case char <= BACKTICK: +- quoted(char) +- case char <= TILDA: +- quoted(char) +- case char == DEL: +- hex(char) +- default: +- hex(char) ++ if (char == SINGLE_QUOTE) { ++ out.Write([]byte{SINGLE_QUOTE, BACKSLASH, SINGLE_QUOTE, SINGLE_QUOTE}) ++ } else { ++ out.WriteByte(char) + } + i++ + } ++ out.WriteByte(SINGLE_QUOTE) + +- outStr := out.String() +- +- if escape { +- outStr = "$'" + outStr + "'" +- } +- +- return outStr ++ return out.String() + } + + func ToBackslash(path string) string { |