diff --git a/res/scripts/stdmin.lua b/res/scripts/stdmin.lua index c3c3d2f0..f2201d94 100644 --- a/res/scripts/stdmin.lua +++ b/res/scripts/stdmin.lua @@ -45,7 +45,7 @@ local canvas_ffi_buffer_size = 0 local _ffi = ffi function __vc_Canvas_set_data(self, data) if type(data) == "cdata" then - self:_set_data(tostring(_ffi.cast("uintptr_t", data))) + self:_set_data(tostring(_ffi.cast("uintptr_t", data.bytes)), data.size) end local width = self.width local height = self.height @@ -60,7 +60,7 @@ function __vc_Canvas_set_data(self, data) for i=0, size - 1 do canvas_ffi_buffer[i] = data[i + 1] end - self:_set_data(tostring(_ffi.cast("uintptr_t", canvas_ffi_buffer))) + self:_set_data(tostring(_ffi.cast("uintptr_t", canvas_ffi_buffer)), data.size) end local ipairs_mt_supported = false diff --git a/src/logic/scripting/lua/usertypes/lua_type_canvas.cpp b/src/logic/scripting/lua/usertypes/lua_type_canvas.cpp index 54bbf654..a7317292 100644 --- a/src/logic/scripting/lua/usertypes/lua_type_canvas.cpp +++ b/src/logic/scripting/lua/usertypes/lua_type_canvas.cpp @@ -220,6 +220,14 @@ static int l_set_data(State* L) { if (lua::isstring(L, 2)) { auto ptr = reinterpret_cast(std::stoull(lua::tostring(L, 2))); + int len = lua::touinteger(L, 3); + if (len < image.getDataSize()) { + throw std::runtime_error( + "data size mismatch expected " + + std::to_string(image.getDataSize()) + ", got " + + std::to_string(len) + ); + } std::memcpy(data, ptr, image.getDataSize()); return 0; }