summaryrefslogtreecommitdiff
path: root/clone.go
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 /clone.go
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.
Diffstat (limited to 'clone.go')
-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 {