Skip to content

Commit

Permalink
wasm: Avoid use-after-free from the assembler
Browse files Browse the repository at this point in the history
Copy the data out instead of returning a view into a locally-declared vector.

Fixes: KhronosGroup#5036
  • Loading branch information
dneto0 committed Dec 22, 2022
1 parent f416d39 commit ee08ca1
Showing 1 changed file with 5 additions and 5 deletions.
10 changes: 5 additions & 5 deletions source/wasm/spirv-tools.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,21 +39,21 @@ std::string dis(std::string const& buffer, uint32_t env, uint32_t options) {
return disassembly;
}

emscripten::val as(std::string const& source, uint32_t env, uint32_t options) {
std::string as(std::string const& source, uint32_t env, uint32_t options) {
spvtools::SpirvTools core(static_cast<spv_target_env>(env));
core.SetMessageConsumer(print_msg_to_stderr);

std::vector<uint32_t> spirv;
if (!core.Assemble(source, &spirv, options)) spirv.clear();
const uint8_t* ptr = reinterpret_cast<const uint8_t*>(spirv.data());
return emscripten::val(emscripten::typed_memory_view(spirv.size() * 4,
ptr));
// Copy the data out.
const auto* ptr = reinterpret_cast<const char*>(spirv.data());
return std::string(ptr,spirv.size()*4);
}

EMSCRIPTEN_BINDINGS(my_module) {
function("dis", &dis);
function("as", &as);

constant("SPV_ENV_UNIVERSAL_1_0", static_cast<uint32_t>(SPV_ENV_UNIVERSAL_1_0));
constant("SPV_ENV_VULKAN_1_0", static_cast<uint32_t>(SPV_ENV_VULKAN_1_0));
constant("SPV_ENV_UNIVERSAL_1_1", static_cast<uint32_t>(SPV_ENV_UNIVERSAL_1_1));
Expand Down

0 comments on commit ee08ca1

Please sign in to comment.