Skip to content

tree-walk causes sigsegv #513

Closed
Closed
@WingT

Description

@WingT

the following go code can cause error:

import (
	"fmt"
	cGit "gopkg.in/libgit2/git2go.v27"
	"log"
	"path"
	"regexp"
)

type Repo struct {
	cRepo *cGit.Repository
}

func (r *Repo) LsTree(revision string, pattern string) ([]string, error) {
	revSpec, err := r.cRepo.Revparse(revision)
	if err != nil {
		return nil, err
	}
	from := revSpec.From()
	if from == nil {
		return nil, fmt.Errorf("revspec error")
	}
	commit, err := from.AsCommit()
	if err != nil {
		return nil, fmt.Errorf("revspec is not a commit")
	}
	tree, err := commit.Tree()
	if err != nil {
		return nil, fmt.Errorf("get tree failed")
	}
	var result []string
	reg := regexp.MustCompile(pattern)
	err = tree.Walk(func(name string, entry *cGit.TreeEntry) int {
		if entry.Type != cGit.ObjectBlob {
			return 0
		}
		fName := path.Join(name, entry.Name)
		if reg.MatchString(fName) {
			result = append(result, fName)
		}
		return 0
	})
	return result, err
}

func main() {
	i := 1
	for {
		cRepo, err := cGit.OpenRepository("path/to/repo")
		if err != nil {
			log.Fatal(err)
		}
		r := Repo{cRepo: cRepo}
		result, err := r.LsTree("master", `.+\.thrift`)
		if err != nil {
			log.Fatal(err)
		}
		fmt.Println(i, len(result))
		cRepo = nil
		i ++
	}
}

after some output, the error stack is as follow:

fatal error: unexpected signal during runtime execution
[signal SIGSEGV: segmentation violation code=0x80 addr=0x0 pc=0x7fb8f6e450e1]

runtime stack:
runtime.throw(0x592b6d, 0x2a)
        /usr/local/go/src/runtime/panic.go:617 +0x72
runtime.sigpanic()
        /usr/local/go/src/runtime/signal_unix.go:374 +0x4a9

goroutine 1 [syscall, locked to thread]:
runtime.cgocall(0x539b60, 0xc0000b3b20, 0x43a371)
        /usr/local/go/src/runtime/cgocall.go:128 +0x5b fp=0xc0000b3af0 sp=0xc0000b3ab8 pc=0x413eab
gopkg.in/libgit2/git2go%2ev27._Cfunc_git_tree_entry_name(0xaa736f566fdea668, 0x0)
        _cgo_gotypes.go:7312 +0x4a fp=0xc0000b3b20 sp=0xc0000b3af0 pc=0x50d96a
gopkg.in/libgit2/git2go%2ev27.newTreeEntry.func1(0xaa736f566fdea668, 0x15152c0)
        /root/go/pkg/mod/gopkg.in/libgit2/git2go.v27@v27.0.0-20190104134018-ecaeb7a21d47/tree.go:43 +0x56 fp=0xc0000b3b58 sp=0xc0000b3b20 pc=0x514196
gopkg.in/libgit2/git2go%2ev27.newTreeEntry(0xaa736f566fdea668, 0x15152c0)
        /root/go/pkg/mod/gopkg.in/libgit2/git2go.v27@v27.0.0-20190104134018-ecaeb7a21d47/tree.go:43 +0x2f fp=0xc0000b3ba8 sp=0xc0000b3b58 pc=0x512d4f
gopkg.in/libgit2/git2go%2ev27.CallbackGitTreeWalk(0x15a1560, 0xaa736f566fdea668, 0x15152c0, 0x595438)
        /root/go/pkg/mod/gopkg.in/libgit2/git2go.v27@v27.0.0-20190104134018-ecaeb7a21d47/tree.go:130 +0x89 fp=0xc0000b3bf0 sp=0xc0000b3ba8 pc=0x512ed9
gopkg.in/libgit2/git2go%2ev27._cgoexpwrap_b67d0ead0026_CallbackGitTreeWalk(0x15a1560, 0xaa736f566fdea668, 0x15152c0, 0x15f8cb0)
        _cgo_gotypes.go:7781 +0x3f fp=0xc0000b3c20 sp=0xc0000b3bf0 pc=0x50eeef
runtime.call32(0x0, 0x7fff825e0980, 0x7fff825e0a10, 0x20)
        /usr/local/go/src/runtime/asm_amd64.s:519 +0x3b fp=0xc0000b3c50 sp=0xc0000b3c20 pc=0x462d9b
runtime.cgocallbackg1(0x0)
        /usr/local/go/src/runtime/cgocall.go:314 +0x177 fp=0xc0000b3cc8 sp=0xc0000b3c50 pc=0x414217
runtime.cgocallbackg(0x0)
        /usr/local/go/src/runtime/cgocall.go:191 +0xc5 fp=0xc0000b3d30 sp=0xc0000b3cc8 pc=0x414005
runtime.cgocallback_gofunc(0x413ecf, 0x5399e0, 0xc0000b3dc0, 0xc0000b3db0)
        /usr/local/go/src/runtime/asm_amd64.s:773 +0x9b fp=0xc0000b3d50 sp=0xc0000b3d30 pc=0x46436b
runtime.asmcgocall(0x5399e0, 0xc0000b3dc0)
        /usr/local/go/src/runtime/asm_amd64.s:620 +0x42 fp=0xc0000b3d58 sp=0xc0000b3d50 pc=0x464202
runtime.cgocall(0x5399e0, 0xc0000b3dc0, 0xf9737137)
        /usr/local/go/src/runtime/cgocall.go:131 +0x7f fp=0xc0000b3d90 sp=0xc0000b3d58 pc=0x413ecf
gopkg.in/libgit2/git2go%2ev27._Cfunc__go_git_treewalk(0x16584f0, 0x0, 0x15152c0, 0x0)
        _cgo_gotypes.go:1892 +0x4d fp=0xc0000b3dc0 sp=0xc0000b3d90 pc=0x50d05d
gopkg.in/libgit2/git2go%2ev27.Tree.Walk.func1(0x16584f0, 0xc000094380, 0x16584f0, 0x15152c0, 0x41ca88)
        /root/go/pkg/mod/gopkg.in/libgit2/git2go.v27@v27.0.0-20190104134018-ecaeb7a21d47/tree.go:146 +0x97 fp=0xc0000b3df8 sp=0xc0000b3dc0 pc=0x5143b7
gopkg.in/libgit2/git2go%2ev27.Tree.Walk(0x16584f0, 0xc000094380, 0x16584f0, 0xc0000844e0, 0x0, 0x0)
        /root/go/pkg/mod/gopkg.in/libgit2/git2go.v27@v27.0.0-20190104134018-ecaeb7a21d47/tree.go:146 +0xd6 fp=0xc0000b3e50 sp=0xc0000b3df8 pc=0x513026
main.(*Repo).LsTree(0xc0000b3f40, 0x58b37e, 0x6, 0x58bd99, 0xa, 0x8, 0x0, 0x0, 0x0, 0x0)
        /go/src/git.byted.org/ee/madeira/idlmgr/data/test.go:34 +0x2d6 fp=0xc0000b3ee0 sp=0xc0000b3e50 pc=0x533cd6
main.main()
        /go/src/git.byted.org/ee/madeira/idlmgr/data/test.go:55 +0x1a4 fp=0xc0000b3f98 sp=0xc0000b3ee0 pc=0x533ff4
runtime.main()
        /usr/local/go/src/runtime/proc.go:200 +0x20c fp=0xc0000b3fe0 sp=0xc0000b3f98 pc=0x43c6bc
runtime.goexit()
        /usr/local/go/src/runtime/asm_amd64.s:1337 +0x1 fp=0xc0000b3fe8 sp=0xc0000b3fe0 pc=0x464ab1
exit status 2

it always fail on _Cfunc_git_tree_entry_name, however the round count can vary.
i'm using libgit2 v0.27.8 and git2go.v27

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions