--- 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 {