diff options
| author | Carlos Martín Nieto <[email protected]> | 2015-08-31 16:05:54 +0200 |
|---|---|---|
| committer | Carlos Martín Nieto <[email protected]> | 2015-08-31 16:07:37 +0200 |
| commit | 4090c401c8bf3f062e898f75bde01e2ef27b3911 (patch) | |
| tree | 04b27dfdf1faadcaff6ca40fa27d8edd690045d1 /clone.go | |
| parent | 2743bbfca3963e2a1cc21513b7ab9e8e8af70bf2 (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.go | 9 |
1 files changed, 5 insertions, 4 deletions
@@ -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 { |
