如何在 Lua 对象上调用析构函数两次以捕获 double free?

问题描述 投票:0回答:1

我需要编写一个测试来诊断使用 ffi.new 创建的 Lua 对象的双重释放。 结果,你需要调用两次collectgarbage(),之后就会出现双重释放的情况。

我写了这个例子:

local ffi = require("ffi")

ffi.cdef[[
typedef struct {
  int x;
} my_struct;
]]

local obj = ffi.new("my_struct", {10})
obj = ffi.gc(obj, function (o)
    print(123)
end)

obj = nil
collectgarbage("collect")
collectgarbage("collect")

但是这个对象的析构函数只被调用了1次

lua ffi luajit double-free
1个回答
0
投票

在 LuaJIT 中不可能对自动管理的内存调用双重释放。
但您可以手动管理内存:

local ffi = require"ffi"
ffi.cdef[[
   typedef struct {
      int x;
   } my_struct;
   void* malloc(size_t);
   void free(void*);
]]

local function my_free(o)
   print(123)
   ffi.C.free(o)
end

local obj = ffi.gc(
   ffi.cast("my_struct*", ffi.C.malloc(ffi.sizeof("my_struct"))), 
   my_free
)

my_free(obj)  -- first free

obj = nil
collectgarbage("collect")  -- second free
© www.soinside.com 2019 - 2024. All rights reserved.