Open
Description
With Go 1.11 and HEAD: go version devel +a2a3dd00c9 Thu Sep 13 09:52:57 2018 +0000 darwin/amd64
, the following program:
package main
// void f(void* ptr) {}
import "C"
import (
"compress/gzip"
"unsafe"
)
type cgoWriter struct{}
func (cgoWriter) Write(p []byte) (int, error) {
ptr := unsafe.Pointer(&p[0])
C.f(ptr)
return 0, nil
}
func main() {
w := cgoWriter{}
gzw := gzip.NewWriter(w)
gzw.Close() // calls cgoWriter.Write
}
Panics:
panic: runtime error: cgo argument has Go pointer to Go pointer
goroutine 1 [running]:
main.cgoWriter.Write.func1(0xc00015e020)
/Users/crawshaw/junk.go:15 +0x48
main.cgoWriter.Write(0xc00015e020, 0x1, 0xf8, 0xc0000b1e50, 0x4027ff1, 0x40dad60)
/Users/crawshaw/junk.go:15 +0x35
compress/flate.(*huffmanBitWriter).write(0xc00015e000, 0xc00015e020, 0x1, 0xf8)
/Users/crawshaw/go/go/src/compress/flate/huffman_bit_writer.go:136 +0x5f
compress/flate.(*huffmanBitWriter).flush(0xc00015e000)
/Users/crawshaw/go/go/src/compress/flate/huffman_bit_writer.go:128 +0xb7
compress/flate.(*huffmanBitWriter).writeStoredHeader(0xc00015e000, 0x0, 0x1)
/Users/crawshaw/go/go/src/compress/flate/huffman_bit_writer.go:412 +0x63
compress/flate.(*compressor).close(0xc0000ba000, 0x0, 0xc0000a62b0)
/Users/crawshaw/go/go/src/compress/flate/deflate.go:647 +0x83
compress/flate.(*Writer).Close(0xc0000ba000, 0x0, 0x0)
/Users/crawshaw/go/go/src/compress/flate/deflate.go:729 +0x2d
compress/gzip.(*Writer).Close(0xc0000a6210, 0x419bf30, 0xc0000a6210)
/Users/crawshaw/go/go/src/compress/gzip/gzip.go:242 +0x6e
main.main()
/Users/crawshaw/junk.go:22 +0x47
I suspect (but cannot yet show that) this is related to the fact that gzip.Writer is passing a []byte to the Write method made out of an array field of the gzip.Writer struct.