summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Martín Nieto <[email protected]>2015-08-31 16:05:54 +0200
committerCarlos Martín Nieto <[email protected]>2015-08-31 16:07:37 +0200
commit4090c401c8bf3f062e898f75bde01e2ef27b3911 (patch)
tree04b27dfdf1faadcaff6ca40fa27d8edd690045d1
parent2743bbfca3963e2a1cc21513b7ab9e8e8af70bf2 (diff)
Don't call the finalizer on a borrowed repository
When libgit2 gives us the repository for us to create the remote in, we do not own it, so we must make sure we don't try to free it.
-rw-r--r--clone.go9
1 files changed, 5 insertions, 4 deletions
diff --git a/clone.go b/clone.go
index b8579b5..e80d14d 100644
--- a/clone.go
+++ b/clone.go
@@ -55,15 +55,16 @@ func remoteCreateCallback(cremote unsafe.Pointer, crepo unsafe.Pointer, cname, c
name := C.GoString(cname)
url := C.GoString(curl)
repo := newRepositoryFromC((*C.git_repository)(crepo))
+ // We don't own this repository, so make sure we don't try to free it
+ runtime.SetFinalizer(repo, nil)
if opts, ok := pointerHandles.Get(payload).(CloneOptions); ok {
remote, err := opts.RemoteCreateCallback(repo, name, url)
+ // clear finalizer as the calling C function will
+ // free the remote itself
+ runtime.SetFinalizer(remote, nil)
if err == ErrOk && remote != nil {
- // clear finalizer as the calling C function will
- // free the remote itself
- runtime.SetFinalizer(remote, nil)
-
cptr := (**C.git_remote)(cremote)
*cptr = remote.ptr
} else if err == ErrOk && remote == nil {