jcs
/subtext
/amendments
/610
db: Fix leaks in failures
jcs made amendment 610 10 months ago
--- db.c Mon May 20 14:19:29 2024
+++ db.c Sat Dec 6 18:06:42 2025
@@ -572,7 +572,7 @@ db_migrate(struct db *tdb, short is_new, Str255 fullpa
break;
}
case 21: {
- /* 20->21, syslog ip */
+ /* 21->22, syslog ip */
struct config new_config = { 0 };
bile_read(tdb->bile, DB_CONFIG_RTYPE, 1, (char *)&new_config,
@@ -668,6 +668,10 @@ db_cache_boards(struct db *tdb)
break;
size = bile_read_alloc(tdb->bile, DB_BOARD_RTYPE, obj->id, &data);
+ if (size == 0 || data == NULL) {
+ xfree(&obj);
+ break;
+ }
bile_unmarshall_object(tdb->bile, board_object_fields,
nboard_object_fields, data, size, (char *)(&tdb->boards[n]),
sizeof(struct board), true);
@@ -776,7 +780,7 @@ db_cache_folders(struct db *tdb)
{
Str255 db_filename, folder_filename, folder_dir;
size_t n, size;
- unsigned long *ids, id;
+ unsigned long *ids, newid;
struct bile_object *obj;
char *data = NULL;
short error;
@@ -814,12 +818,15 @@ db_cache_folders(struct db *tdb)
break;
size = bile_read_alloc(tdb->bile, DB_FOLDER_RTYPE, obj->id, &data);
- if (size == 0 || data == NULL)
+ if (size == 0 || data == NULL) {
+ xfree(&obj);
break;
+ }
bile_unmarshall_object(tdb->bile, folder_object_fields,
nfolder_object_fields, data, size, (char *)(&tdb->folders[n]),
sizeof(struct folder), true);
xfree(&data);
+ xfree(&obj);
}
xfree(&ids);
@@ -865,7 +872,7 @@ db_cache_folders(struct db *tdb)
if (!FIsDir(folder_dir) &&
ask("Folder %ld path \"%s\" does not exist, create it?",
tdb->folders[n].id, tdb->folders[n].path)) {
- error = DirCreate(db->bile->vrefnum, 0, folder_dir, &id);
+ error = DirCreate(db->bile->vrefnum, 0, folder_dir, &newid);
if (error)
warn("Failed creating %s: %d", tdb->folders[n].path,
error);
@@ -879,7 +886,8 @@ db_folder_create(struct db *tdb, struct folder *folder
Str255 db_filename, folder_filename, folder_dir;
struct bile *folder_bile;
size_t size;
- short ret, newid, error;
+ long newid;
+ short ret, error;
char *data;
ret = bile_marshall_object(tdb->bile, folder_object_fields,