summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Martín Nieto <[email protected]>2016-08-27 20:51:13 +0200
committerCarlos Martín Nieto <[email protected]>2016-08-27 20:51:13 +0200
commitb41e4c4ac7c7ec4d45ec5d8903077bd01264549f (patch)
tree3edaeb7610ab39089b3232a1104af804b2497e19
parentb5d213c2c1229ea5de524ee24a9d9635a9cf303f (diff)
Work around Go 1.6's CGo pointer check
It depends heavily on the expression at the call site an whether it can figure out whether we're using a slice or not, so provid an incantation that does this.
-rw-r--r--blob.go17
1 files changed, 13 insertions, 4 deletions
diff --git a/blob.go b/blob.go
index 1a86e60..8b3e94f 100644
--- a/blob.go
+++ b/blob.go
@@ -37,15 +37,24 @@ func (repo *Repository) CreateBlobFromBuffer(data []byte) (*Oid, error) {
defer runtime.UnlockOSThread()
var id C.git_oid
- var ptr unsafe.Pointer
+ var size C.size_t
+ // Go 1.6 added some increased checking of passing pointer to
+ // C, but its check depends on its expectations of waht we
+ // pass to the C function, so unless we take the address of
+ // its contents at the call site itself, it can fail when
+ // 'data' is a slice of a slice.
+ //
+ // When we're given an empty slice, create a dummy one where 0
+ // isn't out of bounds.
if len(data) > 0 {
- ptr = unsafe.Pointer(&data[0])
+ size = C.size_t(len(data))
} else {
- ptr = unsafe.Pointer(nil)
+ data = []byte{0}
+ size = C.size_t(0)
}
- ecode := C.git_blob_create_frombuffer(&id, repo.ptr, ptr, C.size_t(len(data)))
+ ecode := C.git_blob_create_frombuffer(&id, repo.ptr, unsafe.Pointer(&data[0]), size)
if ecode < 0 {
return nil, MakeGitError(ecode)
}