Skip to content

Commit

Permalink
fix: possible memory leak (#51)
Browse files Browse the repository at this point in the history
* fix possible memory leak

* remove unused error
  • Loading branch information
beer-1 authored May 23, 2024
1 parent 7e783bb commit f74f549
Show file tree
Hide file tree
Showing 6 changed files with 31 additions and 29 deletions.
18 changes: 9 additions & 9 deletions api/compiler.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import (
func BuildContract(arg compiler.CompilerArgument) ([]byte, error) {
var err error

errmsg := newUnmanagedVector(nil)
errmsg := uninitializedUnmanagedVector()
buildConfig := arg.BuildConfig

pathBytesView := makeView([]byte(arg.PackagePath))
Expand Down Expand Up @@ -54,7 +54,7 @@ func BuildContract(arg compiler.CompilerArgument) ([]byte, error) {
func TestContract(arg compiler.CompilerArgument, testConfig testtypes.TestConfig) ([]byte, error) {
var err error

errmsg := newUnmanagedVector(nil)
errmsg := uninitializedUnmanagedVector()
buildConfig := arg.BuildConfig

pathBytesView := makeView([]byte(arg.PackagePath))
Expand Down Expand Up @@ -102,7 +102,7 @@ func TestContract(arg compiler.CompilerArgument, testConfig testtypes.TestConfig
func CoverageSummary(arg compiler.CompilerArgument, coverageSummaryConfig coveragetypes.CoverageSummaryConfig) ([]byte, error) {
var err error

errmsg := newUnmanagedVector(nil)
errmsg := uninitializedUnmanagedVector()
buildConfig := arg.BuildConfig

pathBytesView := makeView([]byte(arg.PackagePath))
Expand Down Expand Up @@ -145,7 +145,7 @@ func CoverageSummary(arg compiler.CompilerArgument, coverageSummaryConfig covera
func CoverageSource(arg compiler.CompilerArgument, coverageSourceConfig coveragetypes.CoverageSourceConfig) ([]byte, error) {
var err error

errmsg := newUnmanagedVector(nil)
errmsg := uninitializedUnmanagedVector()
buildConfig := arg.BuildConfig

pathBytesView := makeView([]byte(arg.PackagePath))
Expand Down Expand Up @@ -189,7 +189,7 @@ func CoverageSource(arg compiler.CompilerArgument, coverageSourceConfig coverage
func CoverageBytecode(arg compiler.CompilerArgument, coverageBytecodeConfig coveragetypes.CoverageBytecodeConfig) ([]byte, error) {
var err error

errmsg := newUnmanagedVector(nil)
errmsg := uninitializedUnmanagedVector()
buildConfig := arg.BuildConfig

pathBytesView := makeView([]byte(arg.PackagePath))
Expand Down Expand Up @@ -233,7 +233,7 @@ func CoverageBytecode(arg compiler.CompilerArgument, coverageBytecodeConfig cove
func ProveContract(arg compiler.CompilerArgument, proveConfig provetypes.ProveConfig) ([]byte, error) {
var err error

errmsg := newUnmanagedVector(nil)
errmsg := uninitializedUnmanagedVector()
buildConfig := arg.BuildConfig

pathBytesView := makeView([]byte(arg.PackagePath))
Expand Down Expand Up @@ -292,7 +292,7 @@ func ProveContract(arg compiler.CompilerArgument, proveConfig provetypes.ProveCo
func Docgen(arg compiler.CompilerArgument, docgenOption docgentypes.DocgenConfig) ([]byte, error) {
var err error

errmsg := newUnmanagedVector(nil)
errmsg := uninitializedUnmanagedVector()
buildConfig := arg.BuildConfig

pathBytesView := makeView([]byte(arg.PackagePath))
Expand Down Expand Up @@ -344,7 +344,7 @@ func Docgen(arg compiler.CompilerArgument, docgenOption docgentypes.DocgenConfig
func CreateContractPackage(arg compiler.CompilerArgument, name string) ([]byte, error) {
var err error

errmsg := newUnmanagedVector(nil)
errmsg := uninitializedUnmanagedVector()
buildConfig := arg.BuildConfig

pathBytesView := makeView([]byte(arg.PackagePath))
Expand Down Expand Up @@ -383,7 +383,7 @@ func CreateContractPackage(arg compiler.CompilerArgument, name string) ([]byte,
func CleanContractPackage(arg compiler.CompilerArgument, cleanCache, cleanByproduct, force bool) ([]byte, error) {
var err error

errmsg := newUnmanagedVector(nil)
errmsg := uninitializedUnmanagedVector()
buildConfig := arg.BuildConfig

pathBytesView := makeView([]byte(arg.PackagePath))
Expand Down
16 changes: 8 additions & 8 deletions api/exposed.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func ConvertModuleName(
moduleNameView := makeView([]byte(moduleName))
defer runtime.KeepAlive(moduleNameView)

errmsg := newUnmanagedVector(nil)
errmsg := uninitializedUnmanagedVector()

res, err := C.convert_module_name(&errmsg, precompiledView, moduleNameView)
if err != nil && err.(syscall.Errno) != C.ErrnoValue_Success {
Expand All @@ -49,7 +49,7 @@ func ReadModuleInfo(
compiledView := makeView(compiled)
defer runtime.KeepAlive(compiledView)

errmsg := newUnmanagedVector(nil)
errmsg := uninitializedUnmanagedVector()

res, err := C.read_module_info(&errmsg, compiledView)
if err != nil && err.(syscall.Errno) != C.ErrnoValue_Success {
Expand Down Expand Up @@ -92,7 +92,7 @@ func DecodeMoveResource(
resourceBytesView := makeView(resourceBytes)
defer runtime.KeepAlive(resourceBytesView)

errmsg := newUnmanagedVector(nil)
errmsg := uninitializedUnmanagedVector()

res, err := C.decode_move_resource(db, &errmsg, structTagView, resourceBytesView)
if err != nil && err.(syscall.Errno) != C.ErrnoValue_Success {
Expand Down Expand Up @@ -127,7 +127,7 @@ func DecodeMoveValue(
valueBytesView := makeView(valueBytes)
defer runtime.KeepAlive(valueBytesView)

errmsg := newUnmanagedVector(nil)
errmsg := uninitializedUnmanagedVector()

res, err := C.decode_move_value(db, &errmsg, typeTagView, valueBytesView)
if err != nil && err.(syscall.Errno) != C.ErrnoValue_Success {
Expand All @@ -148,7 +148,7 @@ func DecodeModuleBytes(
moduleBytesView := makeView([]byte(moduleBytes))
defer runtime.KeepAlive(moduleBytesView)

errmsg := newUnmanagedVector(nil)
errmsg := uninitializedUnmanagedVector()

res, err := C.decode_module_bytes(&errmsg, moduleBytesView)
if err != nil && err.(syscall.Errno) != C.ErrnoValue_Success {
Expand All @@ -169,7 +169,7 @@ func DecodeScriptBytes(
scriptBytesView := makeView([]byte(scriptBytes))
defer runtime.KeepAlive(scriptBytesView)

errmsg := newUnmanagedVector(nil)
errmsg := uninitializedUnmanagedVector()

res, err := C.decode_script_bytes(&errmsg, scriptBytesView)
if err != nil && err.(syscall.Errno) != C.ErrnoValue_Success {
Expand All @@ -193,7 +193,7 @@ func ParseStructTag(
structTagStrView := makeView([]byte(structTagStr))
defer runtime.KeepAlive(structTagStrView)

errmsg := newUnmanagedVector(nil)
errmsg := uninitializedUnmanagedVector()

res, err := C.parse_struct_tag(&errmsg, structTagStrView)
if err != nil && err.(syscall.Errno) != C.ErrnoValue_Success {
Expand All @@ -218,7 +218,7 @@ func StringifyStructTag(
structTagView := makeView([]byte(bz))
defer runtime.KeepAlive(structTagView)

errmsg := newUnmanagedVector(nil)
errmsg := uninitializedUnmanagedVector()

res, err := C.stringify_struct_tag(&errmsg, structTagView)
if err != nil && err.(syscall.Errno) != C.ErrnoValue_Success {
Expand Down
6 changes: 6 additions & 0 deletions api/memory.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,12 @@ func constructUnmanagedVector(is_none cbool, ptr cu8_ptr, len cusize, cap cusize
}
}

// uninitializedUnmanagedVector returns an invalid C.UnmanagedVector
// instance. Only use then after someone wrote an instance to it.
func uninitializedUnmanagedVector() C.UnmanagedVector {
return C.UnmanagedVector{}
}

func newUnmanagedVector(data []byte) C.UnmanagedVector {
if data == nil {
return C.new_unmanaged_vector(cbool(true), cu8_ptr(nil), cusize(0))
Expand Down
8 changes: 4 additions & 4 deletions api/vm.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ func Initialize(
ap := makeView(allowedPublishers)
defer runtime.KeepAlive(ap)

errmsg := newUnmanagedVector(nil)
errmsg := uninitializedUnmanagedVector()

_, err = C.initialize(vm.ptr, db, _api, e, mb, ap, &errmsg)
if err != nil && err.(syscall.Errno) != C.ErrnoValue_Success {
Expand Down Expand Up @@ -95,7 +95,7 @@ func ExecuteContract(
msg := makeView(message)
defer runtime.KeepAlive(msg)

errmsg := newUnmanagedVector(nil)
errmsg := uninitializedUnmanagedVector()

res, err := C.execute_contract(vm.ptr, db, _api, e, cu64(gasLimit), sendersView, msg, &errmsg)
if err != nil && err.(syscall.Errno) != C.ErrnoValue_Success {
Expand Down Expand Up @@ -132,7 +132,7 @@ func ExecuteScript(
msg := makeView(message)
defer runtime.KeepAlive(msg)

errmsg := newUnmanagedVector(nil)
errmsg := uninitializedUnmanagedVector()

res, err := C.execute_script(vm.ptr, db, _api, e, cu64(gasLimit), sendersView, msg, &errmsg)
if err != nil && err.(syscall.Errno) != C.ErrnoValue_Success {
Expand Down Expand Up @@ -167,7 +167,7 @@ func ExecuteViewFunction(
msg := makeView(message)
defer runtime.KeepAlive(msg)

errmsg := newUnmanagedVector(nil)
errmsg := uninitializedUnmanagedVector()

res, err := C.execute_view_function(vm.ptr, db, _api, e, cu64(gasLimit), msg, &errmsg)
if err != nil && err.(syscall.Errno) != C.ErrnoValue_Success {
Expand Down
5 changes: 4 additions & 1 deletion libmovevm/src/api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,9 @@ impl QueryAPI for GoApi {
)
.into();

// We destruct the UnmanagedVector here, no matter if we need the data.
let output = response.consume();

// return complete error message (reading from buffer for GoError::Other)
let default = || "Failed to query".to_string();
unsafe {
Expand All @@ -274,7 +277,7 @@ impl QueryAPI for GoApi {
}
}

match response.consume() {
match output {
Some(val) => (Ok(val), used_gas),
None => (Err(anyhow!(default())), used_gas),
}
Expand Down
7 changes: 0 additions & 7 deletions libmovevm/src/error/rust.rs
Original file line number Diff line number Diff line change
Expand Up @@ -152,13 +152,6 @@ pub fn clear_error() {

pub fn set_error(err: RustError, error_msg: Option<&mut UnmanagedVector>) {
if let Some(error_msg) = error_msg {
if error_msg.is_some() {
panic!(
"There is an old error message in the given pointer that has not been \
cleaned up. Error message pointers should not be reused for multiple calls."
)
}

let msg: Vec<u8> = err.to_string().into();
*error_msg = UnmanagedVector::new(Some(msg));
} else {
Expand Down

0 comments on commit f74f549

Please sign in to comment.