]> git.draconx.ca Git - upkg.git/blobdiff - src/uobject/uobject.c
Ensure object property references are released.
[upkg.git] / src / uobject / uobject.c
index 360dd31d2614e586b96d0250983a1b196b9f3fe7..867390f2d7c07ced6bba9de4a3f20c0464d2b869 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  upkg: tool for manipulating Unreal Tournament packages.
- *  Copyright © 2009-2011 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
@@ -16,6 +16,7 @@
  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <config.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -375,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)
@@ -524,15 +531,17 @@ GObject *u_object_new_from_package(GTypeModule *pkg, unsigned long idx)
 {
        g_return_val_if_fail(IS_U_PKG(pkg), NULL);
 
-       const char *class, *package;
+       const struct upkg_export *export;
        GObject *obj = NULL;
        GType type;
 
-       class = upkg_export_class(U_PKG(pkg)->pkg, idx, &package);
-       if (!class)
+       export = upkg_get_export(U_PKG(pkg)->pkg, idx);
+       if (!export) {
+               u_err(pkg, "invalid package export: %lu", idx);
                return NULL;
+       }
 
-       type = u_object_module_get_class(package, class);
+       type = u_object_module_get_class(pkg, export->class);
        if (type) {
                obj = g_object_new(type, NULL);
                if (u_object_deserialize(obj, pkg, idx) != 0) {