:: commit b258face1c46b97847cc21dd4e44ae46092f42cc

mintsuki <mintsuki@protonmail.com> — 2024-07-14 02:32

parents: f5241cbc5c

drivers/disk: Ensure disk_volume_from_efi_handle() does not return erroneous results

diff --git a/common/drivers/disk.s2.c b/common/drivers/disk.s2.c
index f675f266..7be7d7b4 100644
--- a/common/drivers/disk.s2.c
+++ b/common/drivers/disk.s2.c
@@ -410,6 +410,8 @@ struct volume *disk_volume_from_efi_handle(EFI_HANDLE efi_handle) {
 
     block_io->Media->WriteCaching = false;
 
+    struct volume *candidate = NULL;
+    size_t candidate_index = (size_t)-1;
     for (size_t i = 0; i < volume_index_i; i++) {
         if (volume_index[i]->unique_sector_valid == false) {
             continue;
@@ -421,6 +423,10 @@ struct volume *disk_volume_from_efi_handle(EFI_HANDLE efi_handle) {
 
         size_t unique_sector = volume_index[i]->unique_sector / block_io->Media->BlockSize;
 
+        if (candidate != NULL && unique_sector <= candidate_index) {
+            continue;
+        }
+
         status = block_io->ReadBlocks(block_io, block_io->Media->MediaId,
                                       unique_sector,
                                       4096,
@@ -433,10 +439,17 @@ struct volume *disk_volume_from_efi_handle(EFI_HANDLE efi_handle) {
         blake2b(b2b, unique_sector_pool, 4096);
 
         if (memcmp(b2b, volume_index[i]->unique_sector_b2b, BLAKE2B_OUT_BYTES) == 0) {
-            return volume_index[i];
+            if (candidate == NULL || unique_sector > candidate_index) {
+                candidate = volume_index[i];
+                candidate_index = unique_sector;
+            }
         }
     }
 
+    if (candidate != NULL) {
+        return candidate;
+    }
+
     // Fallback to read-back method
 
     uint64_t signature = rand64();
tab: 248 wrap: offon