Skip to content

Commit

Permalink
[release-branch.go1.19] cmd/cover: error out if a requested source fi…
Browse files Browse the repository at this point in the history
…le contains a newline

cmd/cover uses '//line' directives to map instrumented source files
back to the original source file and line numbers.
Line directives have no way to escape newline characters, so cmd/cover
must not be used with source file paths that contain such characters.

Updates #60515.
Updates #60167.

Change-Id: I6dc039392d59fc3a5a6121ef6ca97b0ab0da5288
Reviewed-on: https://go-review.googlesource.com/c/go/+/501577
Auto-Submit: Bryan Mills <bcmills@google.com>
Run-TryBot: Bryan Mills <bcmills@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
(cherry picked from commit 3d78c73)
Reviewed-on: https://go-review.googlesource.com/c/go/+/501822
  • Loading branch information
Bryan C. Mills authored and prattmic committed Jun 13, 2023
1 parent 516ef2d commit 6d44c15
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/cmd/cover/cover.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
"log"
"os"
"sort"
"strings"

"cmd/internal/edit"
"cmd/internal/objabi"
Expand Down Expand Up @@ -341,6 +342,9 @@ func annotate(name string) {
}
}

if strings.ContainsAny(name, "\r\n") {
log.Fatalf("cover: input path contains newline character: %q", name)
}
fmt.Fprintf(fd, "//line %s:1\n", name)
fd.Write(newContent)

Expand Down
31 changes: 31 additions & 0 deletions src/cmd/cover/cover_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -570,3 +570,34 @@ func run(c *exec.Cmd, t *testing.T) {
t.Fatal(err)
}
}

func TestSrcPathWithNewline(t *testing.T) {
t.Parallel()
buildCover(t)

// srcPath is intentionally not clean so that the path passed to testcover
// will not normalize the trailing / to a \ on Windows.
srcPath := t.TempDir() + string(filepath.Separator) + "\npackage main\nfunc main() { panic(string([]rune{'u', 'h', '-', 'o', 'h'}))\n/*/main.go"
mainSrc := ` package main
func main() {
/* nothing here */
println("ok")
}
`
if err := os.MkdirAll(filepath.Dir(srcPath), 0777); err != nil {
t.Skipf("creating directory with bogus path: %v", err)
}
if err := os.WriteFile(srcPath, []byte(mainSrc), 0666); err != nil {
t.Skipf("writing file with bogus directory: %v", err)
}

cmd := exec.Command(testcover, "-mode=atomic", srcPath)
cmd.Stderr = new(bytes.Buffer)
out, err := cmd.Output()
t.Logf("%v:\n%s", cmd, out)
t.Logf("stderr:\n%s", cmd.Stderr)
if err == nil {
t.Errorf("unexpected success; want failure due to newline in file path")
}
}

0 comments on commit 6d44c15

Please sign in to comment.