From 0791f28ac60b8d8541764e480a87cd6bbdc3332b Mon Sep 17 00:00:00 2001
From: Nik <njunger@uwaterloo.ca>
Date: Tue, 4 Dec 2018 23:10:31 -0500
Subject: [PATCH] Fixed memory corruption for non-default randomness

---
 gmp_big.go  | 17 ++++++++++++++---
 rand_hook.c |  2 +-
 utils.go    |  4 ++--
 3 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/gmp_big.go b/gmp_big.go
index 555fc5d..8640831 100644
--- a/gmp_big.go
+++ b/gmp_big.go
@@ -23,6 +23,17 @@ package pbc
 
 /*
 #include <gmp.h>
+#include <stdlib.h>
+
+mpz_t* newMpzT() {
+	mpz_t* x = malloc(sizeof(mpz_t));
+	mpz_init(*x);
+	return x;
+}
+void freeMpzT(mpz_t* x) {
+	mpz_clear(*x);
+	free(x);
+}
 */
 import "C"
 
@@ -33,19 +44,19 @@ import (
 )
 
 type mpz struct {
-	i C.mpz_t
+	i *C.mpz_t
 }
 
 var wordSize C.size_t
 var bitsPerWord C.size_t
 
 func clearMpz(x *mpz) {
-	C.mpz_clear(&x.i[0])
+	C.freeMpzT(x.i)
 }
 
 func newMpz() *mpz {
 	out := &mpz{}
-	C.mpz_init(&out.i[0])
+	out.i = C.newMpzT()
 	runtime.SetFinalizer(out, clearMpz)
 	return out
 }
diff --git a/rand_hook.c b/rand_hook.c
index f0d3a42..228d8c0 100644
--- a/rand_hook.c
+++ b/rand_hook.c
@@ -26,7 +26,7 @@ void pbc_init_random();
 
 void goRandomHook(mpz_t out, mpz_t limit, void* data) {
 	UNUSED_VAR(data);
-	goGenerateRandom(out, limit);
+	goGenerateRandom(&out, &limit);
 }
 
 void installRandomHook() {
diff --git a/utils.go b/utils.go
index 1af0252..2f36c1d 100644
--- a/utils.go
+++ b/utils.go
@@ -81,8 +81,8 @@ func SetRandomProvider(provider RandomSource) {
 
 //export goGenerateRandom
 func goGenerateRandom(out, limit unsafe.Pointer) {
-	outMpz := &mpz{i: *(*C.mpz_t)(out)}
-	limitMpz := &mpz{i: *(*C.mpz_t)(limit)}
+	outMpz := &mpz{i: *(**C.mpz_t)(out)}
+	limitMpz := &mpz{i: *(**C.mpz_t)(limit)}
 	r := randomProvider.Rand(mpz2big(limitMpz))
 	big2thisMpz(r, outMpz)
 }
-- 
GitLab