diff options
Diffstat (limited to 'src/cmd/pack/pack.go')
| -rw-r--r-- | src/cmd/pack/pack.go | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/src/cmd/pack/pack.go b/src/cmd/pack/pack.go index 1c168f946b..3abc83e090 100644 --- a/src/cmd/pack/pack.go +++ b/src/cmd/pack/pack.go @@ -426,8 +426,15 @@ func readPkgdef(file string) (data []byte, err error) { // Read from file, collecting header for __.PKGDEF. // The header is from the beginning of the file until a line // containing just "!". The first line must begin with "go object ". + // + // Note: It's possible for "\n!\n" to appear within the binary + // package export data format. To avoid truncating the package + // definition prematurely (issue 21703), we keep keep track of + // how many "$$" delimiters we've seen. + rbuf := bufio.NewReader(f) var wbuf bytes.Buffer + markers := 0 for { line, err := rbuf.ReadBytes('\n') if err != nil { @@ -436,9 +443,12 @@ func readPkgdef(file string) (data []byte, err error) { if wbuf.Len() == 0 && !bytes.HasPrefix(line, []byte("go object ")) { return nil, errors.New("not a Go object file") } - if bytes.Equal(line, []byte("!\n")) { + if markers%2 == 0 && bytes.Equal(line, []byte("!\n")) { break } + if bytes.HasPrefix(line, []byte("$$")) { + markers++ + } wbuf.Write(line) } return wbuf.Bytes(), nil |
