AmendHub

Download (as of this amendment):

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,