Skip to content

Commit 34fb7e0

Browse files
clnscarlosmn
authored andcommitted
Fix crash when using Pathspec in StatusOptions
Using `StatusOptions.Pathspec` results in a fatal error panic with the message 'unexpected signal during runtime execution'. This is because the `&cpathspec` C.git_strarray gets freed in `*StatusOptions.toC()` before being passed to `C.git_status_init_options()` in `*Repository.StatusList()` (see https://github.com/libgit2/git2go/blob/b3e7705c48f038ef335204a2a9e1ee829784c30e/status.go#L138) The relevant panic trace is: ``` fatal error: unexpected signal during runtime execution [signal 0xb code=0x1 addr=0xb01dfacedebac1e pc=0x4062609] runtime stack: runtime.throw(0x469a080, 0x2a) /usr/local/Cellar/go/1.5.1/libexec/src/runtime/panic.go:527 +0x90 runtime.sigpanic() /usr/local/Cellar/go/1.5.1/libexec/src/runtime/sigpanic_unix.go:12 +0x5a goroutine 71 [syscall, locked to thread]: runtime.cgocall(0x400a720, 0xc8204e9998, 0x0) /usr/local/Cellar/go/1.5.1/libexec/src/runtime/cgocall.go:120 +0x11b fp=0xc8204e9968 sp=0xc8204e9938 github.com/libgit2/git2go._Cfunc_git_status_list_new(0xc8204c39c8, 0x5e17780, 0xc820478c40, 0xc800000000) ??:0 +0x39 fp=0xc8204e9998 sp=0xc8204e9968 github.com/libgit2/git2go.(*Repository).StatusList(0xc820013290, 0xc8204e9b58, 0x0, 0x0, 0x0) /Users/calin/go/src/github.com/libgit2/git2go/status.go:168 +0x11d fp=0xc8204e99e8 sp=0xc8204e9998 ```
1 parent 6d3a349 commit 34fb7e0

File tree

1 file changed

+13
-23
lines changed

1 file changed

+13
-23
lines changed

status.go

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -126,34 +126,24 @@ type StatusOptions struct {
126126
Pathspec []string
127127
}
128128

129-
func (opts *StatusOptions) toC() *C.git_status_options {
130-
if opts == nil {
131-
return nil
132-
}
133-
134-
cpathspec := C.git_strarray{}
135-
if opts.Pathspec != nil {
136-
cpathspec.count = C.size_t(len(opts.Pathspec))
137-
cpathspec.strings = makeCStringsFromStrings(opts.Pathspec)
138-
defer freeStrarray(&cpathspec)
139-
}
140-
141-
copts := &C.git_status_options{
142-
version: C.GIT_STATUS_OPTIONS_VERSION,
143-
show: C.git_status_show_t(opts.Show),
144-
flags: C.uint(opts.Flags),
145-
pathspec: cpathspec,
146-
}
147-
148-
return copts
149-
}
150-
151129
func (v *Repository) StatusList(opts *StatusOptions) (*StatusList, error) {
152130
var ptr *C.git_status_list
153131
var copts *C.git_status_options
154132

155133
if opts != nil {
156-
copts = opts.toC()
134+
cpathspec := C.git_strarray{}
135+
if opts.Pathspec != nil {
136+
cpathspec.count = C.size_t(len(opts.Pathspec))
137+
cpathspec.strings = makeCStringsFromStrings(opts.Pathspec)
138+
defer freeStrarray(&cpathspec)
139+
}
140+
141+
copts = &C.git_status_options{
142+
version: C.GIT_STATUS_OPTIONS_VERSION,
143+
show: C.git_status_show_t(opts.Show),
144+
flags: C.uint(opts.Flags),
145+
pathspec: cpathspec,
146+
}
157147
} else {
158148
copts = &C.git_status_options{}
159149
ret := C.git_status_init_options(copts, C.GIT_STATUS_OPTIONS_VERSION)

0 commit comments

Comments
 (0)