From 4090c401c8bf3f062e898f75bde01e2ef27b3911 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Mon, 31 Aug 2015 16:05:54 +0200 Subject: [PATCH] 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. --- clone.go | 9 +++++---- 1 file 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 {