Merge pull request #3662 from lethosor/fix-unknown-global-field-ref

Fix crash in df.global:_field() when global address is unknown
develop
Myk 2023-08-11 10:38:12 -07:00 committed by GitHub
commit e8a2ac68fe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 36 additions and 1 deletions

@ -664,6 +664,9 @@ static int meta_global_field_reference(lua_State *state)
auto field = (struct_field_info*)find_field(state, 2, "reference");
if (!field)
field_error(state, 2, "builtin property or method", "reference");
void *ptr = *(void**)field->offset;
if (!ptr)
field_error(state, 2, "global address not known", "reference");
field_reference(state, field, *(void**)field->offset);
return 1;
}

@ -1,4 +1,4 @@
config.mode = 'title'
config.mode = 'title' -- not safe to run when a world is loaded
config.target = 'core'
local function clean_vec(vec)

@ -0,0 +1,32 @@
config.target = 'core'
local function with_temp_global_address(name, addr, callback, ...)
dfhack.call_with_finalizer(2, true,
dfhack.internal.setAddress, name, dfhack.internal.getAddress(name),
function(...)
dfhack.internal.setAddress(name, addr)
callback(...)
end, ...)
end
function test.unknown_global_address()
expect.ne(dfhack.internal.getAddress('army_next_id'), 0)
local old_id = df.global.army_next_id
with_temp_global_address('army_next_id', 0, function()
expect.error_match('Cannot read field global.army_next_id: global address not known.', function()
local _ = df.global.army_next_id
end)
expect.error_match('Cannot write field global.army_next_id: global address not known.', function()
df.global.army_next_id = old_id
end)
expect.error_match('Cannot reference field global.army_next_id: global address not known.', function()
local _ = df.global:_field('army_next_id')
end)
end)
expect.gt(dfhack.internal.getAddress('army_next_id'), 0)
expect.eq(df.global.army_next_id, old_id)
end