:: commit 2bb2fd33e788280f6ca4e98f76374085c4dfa8cc

Mintsuki <mintsuki@protonmail.com> — 2026-01-11 21:12

parents: 403b4d57bf

host: Fix memory leaks in error paths

diff --git a/host/limine.c b/host/limine.c
index b7a18cd2..273c79c6 100644
--- a/host/limine.c
+++ b/host/limine.c
@@ -390,6 +390,7 @@ static bool load_uninstall_data(const char *filename) {
         goto error;
     }
 
+    size_t loaded_count = 0;
     for (size_t i = 0; i < uninstall_data_i; i++) {
         if (fread(&uninstall_data[i].loc, sizeof(uint64_t), 1, udfile) != 1) {
             goto fread_error;
@@ -403,8 +404,10 @@ static bool load_uninstall_data(const char *filename) {
             goto error;
         }
         if (fread(uninstall_data[i].data, uninstall_data[i].count, 1, udfile) != 1) {
+            free(uninstall_data[i].data);
             goto fread_error;
         }
+        loaded_count++;
     }
 
     fclose(udfile);
@@ -414,6 +417,10 @@ fread_error:
     perror_wrap("error: load_uninstall_data(): fread()");
 
 error:
+    // Free any previously allocated uninstall data
+    for (size_t j = 0; j < loaded_count; j++) {
+        free(uninstall_data[j].data);
+    }
     if (udfile != NULL) {
         fclose(udfile);
     }
@@ -461,6 +468,7 @@ static bool _device_write(const void *_buffer, uint64_t loc, size_t count) {
     }
 
     if (!_device_read(ud->data, loc, count)) {
+        free(ud->data);
         return false;
     }
 
@@ -474,6 +482,9 @@ skip_save:;
         uint64_t block = (loc + progress) / block_size;
 
         if (!device_cache_block(block)) {
+            if (!uninstalling) {
+                free(ud->data);
+            }
             return false;
         }
 
tab: 248 wrap: offon