Closed
Description
After upgrading from go1.3 to go1.4, I'd get a runtime crash most of the time. It crashes for various reasons (nil tree walker callback, invalid heap pointer...). Here is a scaled down version of the code that demonstrates the problem (runtime crashes most of the time). Run this code with an argument pointing at a git repository like git2go.
package main
import (
"fmt"
"github.com/libgit2/git2go"
"os"
"strings"
)
type MyRepo struct {
*git.Repository
}
func (repository *MyRepo) foo(path string, treeEntry *git.TreeEntry) int {
if git.ObjectBlob != treeEntry.Type {
return 0 // continue
}
if !strings.HasSuffix(treeEntry.Name, ".go") {
return 0 // continue
}
blob, err := repository.Repository.LookupBlob(treeEntry.Id)
defer blob.Free()
if err != nil {
panic(err)
}
if blob.Size() > 10000 {
return 0 // continue
}
contents := blob.Contents()
if contents == nil {
panic("nil contents")
}
fmt.Printf("%q", path, treeEntry.Name, string(contents))
fmt.Println()
return 0 // continue
}
func main() {
filename := os.Args[1]
repository, err := git.OpenRepository(filename)
if err != nil {
panic(err)
}
defer repository.Free()
myRepo := MyRepo{repository}
revWalk, err := repository.Walk()
if err != nil {
panic(err)
}
defer revWalk.Free()
// Start out at the head
err = revWalk.PushHead()
if err != nil {
panic(err)
}
err = revWalk.Iterate(func(commit *git.Commit) bool {
defer commit.Free()
tree, err := commit.Tree()
if err != nil {
panic(err)
}
defer tree.Free()
err = tree.Walk(myRepo.foo)
if err != nil {
panic(err)
}
return true
})
if err != nil {
panic(err)
}
}
Some errors that come from the above code:
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x0 pc=0x40f4299]
goroutine 1 [running]:
github.com/libgit2/git2go.CallbackGitTreeWalk(0x438a520, 0x51008e0, 0xc208071e40, 0x0)
/Users/maleticm/.gvm/pkgsets/go1.4/jack/src/github.com/libgit2/git2go/tree.go:99 +0x79
github.com/libgit2/git2go._Cfunc__go_git_treewalk(0x5100850, 0x0, 0xc208069e40, 0x0)
/Users/maleticm/.gvm/pkgsets/go1.4/jack/src/github.com/libgit2/git2go/:402 +0x43
github.com/libgit2/git2go.Tree.Walk(0x5100850, 0xc20802c018, 0x5100850, 0xc208069e80, 0x0, 0x0)
runtime: garbage collector found invalid heap pointer *(0xc208069cd0+0x10)=0xc208083e40 span=0xc20807e000-0xc208083800-0xc208084000 state=0
fatal error: invalid heap pointer
runtime stack:
runtime.throw(0x437df83)
/Users/maleticm/.gvm/gos/go1.4/src/runtime/panic.go:491 +0xad fp=0x7fff5fbfea18 sp=0x7fff5fbfe9e8
scanblock(0xc208069cd0, 0x20, 0x42c12e4)
/Users/maleticm/.gvm/gos/go1.4/src/runtime/mgc0.c:378 +0x551 fp=0x7fff5fbfeb58 sp=0x7fff5fbfea18
scanframe(0x7fff5fbfec60, 0x0, 0x1)
/Users/maleticm/.gvm/gos/go1.4/src/runtime/mgc0.c:740 +0x1c2 fp=0x7fff5fbfebc8 sp=0x7fff5fbfeb58
unexpected fault address 0xb01dfacedebac1e
fatal error: fault
[signal 0xb code=0x1 addr=0xb01dfacedebac1e pc=0x40f4299]
goroutine 1 [running, locked to thread]:
runtime.gothrow(0x426ec90, 0x5)
/Users/maleticm/.gvm/gos/go1.4/src/runtime/panic.go:503 +0x8e fp=0xc208069c40 sp=0xc208069c28
runtime.sigpanic()
/Users/maleticm/.gvm/gos/go1.4/src/runtime/sigpanic_unix.go:29 +0x261 fp=0xc208069c90 sp=0xc208069c40
github.com/libgit2/git2go.CallbackGitTreeWalk(0x438a520, 0x5009680, 0xc208073e40, 0x0)
Metadata
Metadata
Assignees
Labels
No labels