From 2f100f68e24078ad15d203145ecf6a951faec77e Mon Sep 17 00:00:00 2001 From: jimboj Date: Tue, 18 Apr 2023 11:53:54 -0600 Subject: [PATCH] panic on invalid pointer cast --- lib/runtime/wasmer/imports.go | 28 +++++++++++++--------------- lib/runtime/wasmer/instance.go | 3 +++ 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/lib/runtime/wasmer/imports.go b/lib/runtime/wasmer/imports.go index 0eeaccf6113..04943208ae6 100644 --- a/lib/runtime/wasmer/imports.go +++ b/lib/runtime/wasmer/imports.go @@ -184,7 +184,7 @@ func ext_crypto_ed25519_generate_version_1(env interface{}, args []wasmer.Value) castedRet, err := safeCastInt32(ret) if err != nil { logger.Errorf("failed to safely cast pointer: %s", err) - return []wasmer.Value{wasmer.NewI32(0)}, nil + return []wasmer.Value{wasmer.NewI32(0)}, err } logger.Debug("generated ed25519 keypair with public key: " + kp.Public().Hex()) @@ -527,7 +527,7 @@ func ext_crypto_sr25519_generate_version_1(env interface{}, args []wasmer.Value) castedRet, err := safeCastInt32(ret) if err != nil { logger.Errorf("failed to safely cast pointer: %s", err) - return []wasmer.Value{wasmer.NewI32(0)}, nil + return []wasmer.Value{wasmer.NewI32(0)}, err } logger.Debug("generated sr25519 keypair with public key: " + kp.Public().Hex()) @@ -801,12 +801,11 @@ func ext_trie_blake2_256_root_version_1(env interface{}, args []wasmer.Value) ([ castedPtr, err := safeCastInt32(ptr) if err != nil { logger.Errorf("failed to safely cast pointer: %s", err) - return []wasmer.Value{wasmer.NewI32(0)}, nil + return []wasmer.Value{wasmer.NewI32(0)}, err } logger.Debugf("root hash is %s", hash) copy(memory[ptr:ptr+32], hash[:]) - // TODO should i use cased pointer above? Maybe should just panic if safeCast fails return []wasmer.Value{wasmer.NewI32(castedPtr)}, nil } @@ -862,12 +861,11 @@ func ext_trie_blake2_256_ordered_root_version_1(env interface{}, args []wasmer.V castedPtr, err := safeCastInt32(ptr) if err != nil { logger.Errorf("failed to safely cast pointer: %s", err) - return []wasmer.Value{wasmer.NewI32(0)}, nil + return []wasmer.Value{wasmer.NewI32(0)}, err } logger.Debugf("root hash is %s", hash) copy(memory[ptr:ptr+32], hash[:]) - // TODO use casted pointer here? Maybe panic? return []wasmer.Value{wasmer.NewI32(castedPtr)}, nil } @@ -1336,7 +1334,7 @@ func ext_allocator_malloc_version_1(env interface{}, args []wasmer.Value) ([]was castedRes, err := safeCastInt32(res) if err != nil { logger.Errorf("failed to safely cast pointer: %s", err) - return []wasmer.Value{wasmer.NewI32(0)}, nil + return []wasmer.Value{wasmer.NewI32(0)}, err } return []wasmer.Value{wasmer.NewI32(castedRes)}, nil @@ -1368,7 +1366,7 @@ func ext_hashing_blake2_128_version_1(env interface{}, args []wasmer.Value) ([]w castedOut, err := safeCastInt32(out) if err != nil { logger.Errorf("failed to safely cast pointer: %s", err) - return []wasmer.Value{wasmer.NewI32(0)}, nil + return []wasmer.Value{wasmer.NewI32(0)}, err } return []wasmer.Value{wasmer.NewI32(castedOut)}, nil @@ -1398,7 +1396,7 @@ func ext_hashing_blake2_256_version_1(env interface{}, args []wasmer.Value) ([]w castedOut, err := safeCastInt32(out) if err != nil { logger.Errorf("failed to safely cast pointer: %s", err) - return []wasmer.Value{wasmer.NewI32(0)}, nil + return []wasmer.Value{wasmer.NewI32(0)}, err } return []wasmer.Value{wasmer.NewI32(castedOut)}, nil @@ -1428,7 +1426,7 @@ func ext_hashing_keccak_256_version_1(env interface{}, args []wasmer.Value) ([]w castedOut, err := safeCastInt32(out) if err != nil { logger.Errorf("failed to safely cast pointer: %s", err) - return []wasmer.Value{wasmer.NewI32(0)}, nil + return []wasmer.Value{wasmer.NewI32(0)}, err } return []wasmer.Value{wasmer.NewI32(castedOut)}, nil @@ -1453,7 +1451,7 @@ func ext_hashing_sha2_256_version_1(env interface{}, args []wasmer.Value) ([]was castedOut, err := safeCastInt32(out) if err != nil { logger.Errorf("failed to safely cast pointer: %s", err) - return []wasmer.Value{wasmer.NewI32(0)}, nil + return []wasmer.Value{wasmer.NewI32(0)}, err } return []wasmer.Value{wasmer.NewI32(castedOut)}, nil @@ -1483,7 +1481,7 @@ func ext_hashing_twox_256_version_1(env interface{}, args []wasmer.Value) ([]was castedOut, err := safeCastInt32(out) if err != nil { logger.Errorf("failed to safely cast pointer: %s", err) - return []wasmer.Value{wasmer.NewI32(0)}, nil + return []wasmer.Value{wasmer.NewI32(0)}, err } return []wasmer.Value{wasmer.NewI32(castedOut)}, nil @@ -1515,7 +1513,7 @@ func ext_hashing_twox_128_version_1(env interface{}, args []wasmer.Value) ([]was castedOut, err := safeCastInt32(out) if err != nil { logger.Errorf("failed to safely cast pointer: %s", err) - return []wasmer.Value{wasmer.NewI32(0)}, nil + return []wasmer.Value{wasmer.NewI32(0)}, err } return []wasmer.Value{wasmer.NewI32(castedOut)}, nil @@ -1547,7 +1545,7 @@ func ext_hashing_twox_64_version_1(env interface{}, args []wasmer.Value) ([]wasm castedOut, err := safeCastInt32(out) if err != nil { logger.Errorf("failed to safely cast pointer: %s", err) - return []wasmer.Value{wasmer.NewI32(0)}, nil + return []wasmer.Value{wasmer.NewI32(0)}, err } return []wasmer.Value{wasmer.NewI32(castedOut)}, nil @@ -1754,7 +1752,7 @@ func ext_offchain_random_seed_version_1(env interface{}, _ []wasmer.Value) ([]wa castedPtr, err := safeCastInt32(ptr) if err != nil { logger.Errorf("failed to safely cast pointer: %s", err) - return []wasmer.Value{wasmer.NewI32(0)}, nil + return []wasmer.Value{wasmer.NewI32(0)}, err } return []wasmer.Value{wasmer.NewI32(castedPtr)}, nil diff --git a/lib/runtime/wasmer/instance.go b/lib/runtime/wasmer/instance.go index 89a7ad74806..bdd03fa6fb7 100644 --- a/lib/runtime/wasmer/instance.go +++ b/lib/runtime/wasmer/instance.go @@ -291,6 +291,9 @@ func (in *Instance) Exec(function string, data []byte) (result []byte, err error wasmValue, err := runtimeFunc(castedInputPointer, castedDataLength) if err != nil { + if errors.Is(err, errMemoryValueOutOfBounds) { + panic(fmt.Errorf("executing runtime function: %v", err)) + } return nil, fmt.Errorf("running runtime function: %w", err) }