1
0
mirror of https://github.com/golang/go synced 2024-11-17 10:04:43 -07:00

syscall: restore EscapeArg behavior for empty string

Accidentally broken by CL 259978.

For #41825

Change-Id: Id663514e6eefa325faccdb66493d0bb2b3281046
Reviewed-on: https://go-review.googlesource.com/c/go/+/260397
Trust: Ian Lance Taylor <iant@golang.org>
Trust: Alex Brainman <alex.brainman@gmail.com>
Trust: Emmanuel Odeke <emm.odeke@gmail.com>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Ian Lance Taylor 2020-10-07 11:15:01 -07:00
parent a4b95cd092
commit 9e0837f2e9
2 changed files with 46 additions and 0 deletions

View File

@ -24,6 +24,9 @@ var ForkLock sync.RWMutex
// - finally, s is wrapped with double quotes (arg -> "arg"), // - finally, s is wrapped with double quotes (arg -> "arg"),
// but only if there is space or tab inside s. // but only if there is space or tab inside s.
func EscapeArg(s string) string { func EscapeArg(s string) string {
if len(s) == 0 {
return `""`
}
for i := 0; i < len(s); i++ { for i := 0; i < len(s); i++ {
switch s[i] { switch s[i] {
case '"', '\\', ' ', '\t': case '"', '\\', ' ', '\t':

View File

@ -0,0 +1,43 @@
// Copyright 2020 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package syscall_test
import (
"syscall"
"testing"
)
func TestEscapeArg(t *testing.T) {
var tests = []struct {
input, output string
}{
{``, `""`},
{`a`, `a`},
{` `, `" "`},
{`\`, `\`},
{`"`, `\"`},
{`\"`, `\\\"`},
{`\\"`, `\\\\\"`},
{`\\ `, `"\\ "`},
{` \\`, `" \\\\"`},
{`a `, `"a "`},
{`C:\`, `C:\`},
{`C:\Program Files (x32)\Common\`, `"C:\Program Files (x32)\Common\\"`},
{`C:\Users\Игорь\`, `C:\Users\Игорь\`},
{`Андрей\file`, `Андрей\file`},
{`C:\Windows\temp`, `C:\Windows\temp`},
{`c:\temp\newfile`, `c:\temp\newfile`},
{`\\?\C:\Windows`, `\\?\C:\Windows`},
{`\\?\`, `\\?\`},
{`\\.\C:\Windows\`, `\\.\C:\Windows\`},
{`\\server\share\file`, `\\server\share\file`},
{`\\newserver\tempshare\really.txt`, `\\newserver\tempshare\really.txt`},
}
for _, test := range tests {
if got := syscall.EscapeArg(test.input); got != test.output {
t.Errorf("EscapeArg(%#q) = %#q, want %#q", test.input, got, test.output)
}
}
}