From 82568fc97fa528e92f2de5e97717b542b921ccf3 Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Thu, 30 Jan 2020 14:27:56 -0500 Subject: [PATCH] Ensure object property references are released. It seems that g_object_set_property adds to the reference count of object properties, so we must release our original reference when deserializing. Add finalizers for Engine.Texture and Engine.Palette to release the palette memory. --- src/engine/palette.gob | 4 ++-- src/engine/texture.gob | 6 +++--- src/uobject/uobject.c | 8 +++++++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/engine/palette.gob b/src/engine/palette.gob index 08d0b78..ce57459 100644 --- a/src/engine/palette.gob +++ b/src/engine/palette.gob @@ -1,7 +1,7 @@ %alltop{ /* * upkg: tool for manipulating Unreal Tournament packages. - * Copyright © 2011 Nick Bowler + * Copyright © 2011, 2020 Nick Bowler * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -33,7 +33,7 @@ typedef unsigned char engine_palette_rgba[4]; class Engine:Palette from U:Object (dynamic) { public unsigned entries = 0; - public engine_palette_rgba *rgba = NULL; + public engine_palette_rgba *rgba = NULL destroywith free; override (U:Object) int deserialize(U:Object *uo) { diff --git a/src/engine/texture.gob b/src/engine/texture.gob index 49af538..981c898 100644 --- a/src/engine/texture.gob +++ b/src/engine/texture.gob @@ -1,7 +1,7 @@ %alltop{ /* * upkg: tool for manipulating Unreal Tournament packages. - * Copyright © 2009-2011 Nick Bowler + * Copyright © 2009-2012, 2020 Nick Bowler * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -119,8 +119,8 @@ class Engine:Texture from U:Object (dynamic) private float DrawScale; - private Engine:Palette *Palette; - private Engine:Texture *DetailTexture; + private Engine:Palette *Palette = NULL destroywith g_object_unref; + private Engine:Texture *DetailTexture = NULL destroywith g_object_unref; private struct engine_texture_data **mipmap_data; private unsigned char mipmap_count; diff --git a/src/uobject/uobject.c b/src/uobject/uobject.c index c3cc246..867390f 100644 --- a/src/uobject/uobject.c +++ b/src/uobject/uobject.c @@ -1,6 +1,6 @@ /* * upkg: tool for manipulating Unreal Tournament packages. - * Copyright © 2009-2012, 2015 Nick Bowler + * Copyright © 2009-2012, 2015, 2020 Nick Bowler * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -376,6 +376,12 @@ static unsigned long deserialize_property(UObject *uo, struct prop_head *head) if (rc != 0) return 0; g_object_set_property(G_OBJECT(uo), head->prop_name, &val); + + /* + * g_object_set_property increments refcount, + * release our reference. + */ + g_object_unref(g_value_get_object(&val)); break; case PROPERTY_FLOAT: if (head->size != 4 || priv->nbuf-len < head->size) -- 2.43.0