diff --git a/common/libzkp/impl/src/utils.rs b/common/libzkp/impl/src/utils.rs index 6305ddb8c8..b06589a00c 100644 --- a/common/libzkp/impl/src/utils.rs +++ b/common/libzkp/impl/src/utils.rs @@ -11,6 +11,12 @@ use std::{ pub(crate) static OUTPUT_DIR: Lazy> = Lazy::new(|| env::var("PROVER_OUTPUT_DIR").ok()); +/// # Safety +#[no_mangle] +pub unsafe extern "C" fn free_c_chars(ptr: *mut c_char) { + let _ = CString::from_raw(ptr); +} + pub(crate) fn c_char_to_str(c: *const c_char) -> &'static str { let cstr = unsafe { CStr::from_ptr(c) }; cstr.to_str().unwrap() diff --git a/common/libzkp/interface/libzkp.h b/common/libzkp/interface/libzkp.h index 1c84af15bd..1c13960879 100644 --- a/common/libzkp/interface/libzkp.h +++ b/common/libzkp/interface/libzkp.h @@ -12,3 +12,4 @@ char* gen_chunk_proof(char* block_traces); char verify_chunk_proof(char* proof); char* block_traces_to_chunk_info(char* block_traces); +void free_c_chars(char* ptr); diff --git a/prover/core/prover.go b/prover/core/prover.go index 764773a603..c006e2dd23 100644 --- a/prover/core/prover.go +++ b/prover/core/prover.go @@ -42,7 +42,7 @@ func NewProverCore(cfg *config.ProverCoreConfig) (*ProverCore, error) { var vk string var rawVK *C.char - defer C.free(unsafe.Pointer(rawVK)) + defer C.free_c_chars(rawVK) if cfg.ProofType == message.ProofTypeBatch { C.init_batch_prover(paramsPathStr, assetsPathStr) rawVK = C.get_batch_vk() @@ -162,7 +162,7 @@ func (p *ProverCore) checkChunkProofs(chunkProofsByt []byte) (bool, error) { log.Info("Start to check chunk proofs ...") cResult := C.check_chunk_proofs(chunkProofsStr) - defer C.free(unsafe.Pointer(cResult)) + defer C.free_c_chars(cResult) log.Info("Finish checking chunk proofs!") var result CheckChunkProofsResponse @@ -189,7 +189,7 @@ func (p *ProverCore) proveBatch(chunkInfosByt []byte, chunkProofsByt []byte) ([] log.Info("Start to create batch proof ...") bResult := C.gen_batch_proof(chunkInfosStr, chunkProofsStr) - defer C.free(unsafe.Pointer(bResult)) + defer C.free_c_chars(bResult) log.Info("Finish creating batch proof!") var result ProofResult @@ -211,7 +211,7 @@ func (p *ProverCore) proveChunk(tracesByt []byte) ([]byte, error) { log.Info("Start to create chunk proof ...") cProof := C.gen_chunk_proof(tracesStr) - defer C.free(unsafe.Pointer(cProof)) + defer C.free_c_chars(cProof) log.Info("Finish creating chunk proof!") var result ProofResult @@ -243,7 +243,7 @@ func (p *ProverCore) mayDumpProof(id string, proofByt []byte) error { func (p *ProverCore) tracesToChunkInfo(tracesByt []byte) []byte { tracesStr := C.CString(string(tracesByt)) - defer C.free(unsafe.Pointer(tracesStr)) + defer C.free_c_chars(tracesStr) cChunkInfo := C.block_traces_to_chunk_info(tracesStr) defer C.free(unsafe.Pointer(cChunkInfo))