Skip to content
This repository was archived by the owner on May 24, 2026. It is now read-only.

Commit 4ae58ff

Browse files
committed
Better ref counting
1 parent 8aa8ffc commit 4ae58ff

6 files changed

Lines changed: 208 additions & 151 deletions

File tree

msi-interop/database.c

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,10 @@ MsiDatabaseCommit(MSIHANDLE hDatabase)
181181
return ERROR_INVALID_HANDLE;
182182

183183
GError *error = NULL;
184-
if (!libmsi_database_commit(db, &error))
184+
gboolean ok = libmsi_database_commit(db, &error);
185+
g_object_unref(db);
186+
187+
if (!ok)
185188
return gerror_to_msi(error);
186189

187190
return ERROR_SUCCESS;
@@ -198,10 +201,9 @@ MsiGetDatabaseState(MSIHANDLE hDatabase)
198201
if (!db)
199202
return MSIDBSTATE_ERROR;
200203

201-
if (libmsi_database_is_readonly(db))
202-
return MSIDBSTATE_READ;
203-
204-
return MSIDBSTATE_WRITE;
204+
MSIDBSTATE ret = libmsi_database_is_readonly(db) ? MSIDBSTATE_READ : MSIDBSTATE_WRITE;
205+
g_object_unref(db);
206+
return ret;
205207
}
206208

207209
/* -------------------------------------------------------------------------- */
@@ -220,6 +222,8 @@ MsiDatabaseGetPrimaryKeysA(MSIHANDLE hDatabase, LPCSTR szTableName, MSIHANDLE *p
220222

221223
GError *error = NULL;
222224
LibmsiRecord *rec = libmsi_database_get_primary_keys(db, szTableName, &error);
225+
g_object_unref(db);
226+
223227
if (!rec)
224228
return gerror_to_msi(error);
225229

@@ -264,6 +268,8 @@ MsiDatabaseIsTablePersistentA(MSIHANDLE hDatabase, LPCSTR szTableName)
264268

265269
GError *error = NULL;
266270
gboolean persistent = libmsi_database_is_table_persistent(db, szTableName, &error);
271+
g_object_unref(db);
272+
267273
if (error) {
268274
g_error_free(error);
269275
return MSICONDITION_ERROR;
@@ -307,6 +313,7 @@ MsiDatabaseImportA(MSIHANDLE hDatabase, LPCSTR szFolderPath, LPCSTR szFileName)
307313
GError *error = NULL;
308314
gboolean ok = libmsi_database_import(db, full_path, &error);
309315
g_free(full_path);
316+
g_object_unref(db);
310317

311318
if (!ok)
312319
return gerror_to_msi(error);
@@ -360,8 +367,10 @@ MsiDatabaseExportA(MSIHANDLE hDatabase, LPCSTR szTableName, LPCSTR szFolderPath,
360367
#endif
361368
g_free(full_path);
362369

363-
if (fd < 0)
370+
if (fd < 0) {
371+
g_object_unref(db);
364372
return ERROR_FUNCTION_FAILED;
373+
}
365374

366375
GError *error = NULL;
367376
gboolean ok = libmsi_database_export(db, szTableName, fd, &error);
@@ -372,6 +381,8 @@ MsiDatabaseExportA(MSIHANDLE hDatabase, LPCSTR szTableName, LPCSTR szFolderPath,
372381
close(fd);
373382
#endif
374383

384+
g_object_unref(db);
385+
375386
if (!ok)
376387
return gerror_to_msi(error);
377388

@@ -415,11 +426,17 @@ MsiDatabaseMergeA(MSIHANDLE hDatabase, MSIHANDLE hDatabaseMerge, LPCSTR szTableN
415426
return ERROR_INVALID_HANDLE;
416427

417428
LibmsiDatabase *db_merge = (LibmsiDatabase *)handle_table_get_typed(hDatabaseMerge, HANDLE_DATABASE);
418-
if (!db_merge)
429+
if (!db_merge) {
430+
g_object_unref(db);
419431
return ERROR_INVALID_HANDLE;
432+
}
420433

421434
GError *error = NULL;
422-
if (!libmsi_database_merge(db, db_merge, szTableName, &error))
435+
gboolean ok = libmsi_database_merge(db, db_merge, szTableName, &error);
436+
g_object_unref(db);
437+
g_object_unref(db_merge);
438+
439+
if (!ok)
423440
return gerror_to_msi(error);
424441

425442
return ERROR_SUCCESS;
@@ -457,7 +474,10 @@ MsiDatabaseApplyTransformA(MSIHANDLE hDatabase, LPCSTR szTransformFile,
457474
return ERROR_INVALID_HANDLE;
458475

459476
GError *error = NULL;
460-
if (!libmsi_database_apply_transform(db, szTransformFile, &error))
477+
gboolean ok = libmsi_database_apply_transform(db, szTransformFile, &error);
478+
g_object_unref(db);
479+
480+
if (!ok)
461481
return gerror_to_msi(error);
462482

463483
return ERROR_SUCCESS;

msi-interop/handle_table.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ handle_table_get(MSIHANDLE handle)
129129
}
130130

131131
GObject *obj = slots[index].obj;
132+
g_object_ref(obj);
132133

133134
g_mutex_unlock(&table_mutex);
134135

@@ -156,6 +157,7 @@ handle_table_get_typed(MSIHANDLE handle, HandleType type)
156157
}
157158

158159
GObject *obj = slots[index].obj;
160+
g_object_ref(obj);
159161

160162
g_mutex_unlock(&table_mutex);
161163

msi-interop/handle_table.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ void handle_table_init(void);
1919
// Allocate a handle for a GObject, adds a ref. Returns 0 on failure.
2020
MSIHANDLE handle_table_alloc(GObject *obj, HandleType type);
2121

22-
// Get the GObject for a handle. Does NOT add a ref. Returns NULL if invalid.
22+
// Get the GObject for a handle. Adds a ref; caller must g_object_unref(). Returns NULL if invalid.
2323
GObject *handle_table_get(MSIHANDLE handle);
2424

25-
// Get the GObject for a handle with type check. Returns NULL if invalid or wrong type.
25+
// Get the GObject for a handle with type check. Adds a ref; caller must g_object_unref(). Returns NULL if invalid or wrong type.
2626
GObject *handle_table_get_typed(MSIHANDLE handle, HandleType type);
2727

2828
// Close a handle, unrefs the GObject. Returns 0 on success, non-zero on error.

0 commit comments

Comments
 (0)