]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Fixed a cache collision bug. Thanks guufy1 for bugreport and test
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Thu, 23 Jun 2011 07:39:12 +0000 (09:39 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Thu, 23 Jun 2011 07:39:12 +0000 (09:39 +0200)
grub-core/kern/disk.c

index 30bc604f0096c35dbc0a18ae65ae83691881289c..f1456defd78c21f91db55e7a0770391657efa933 100644 (file)
@@ -544,6 +544,17 @@ grub_disk_read (grub_disk_t disk, grub_disk_addr_t sector,
            break;
        }
 
+      if (data)
+       {
+         grub_memcpy ((char *) buf
+                      + (agglomerate << (GRUB_DISK_CACHE_BITS
+                                         + GRUB_DISK_SECTOR_BITS)),
+                      data, GRUB_DISK_CACHE_SIZE << GRUB_DISK_SECTOR_BITS);
+         grub_disk_cache_unlock (disk->dev->id, disk->id,
+                                 sector + (agglomerate
+                                           << GRUB_DISK_CACHE_BITS));
+       }
+
       if (agglomerate)
        {
          grub_disk_addr_t i;
@@ -568,17 +579,12 @@ grub_disk_read (grub_disk_t disk, grub_disk_addr_t sector,
          buf = (char *) buf 
            + (agglomerate << (GRUB_DISK_CACHE_BITS + GRUB_DISK_SECTOR_BITS));
        }
-       
+
       if (data)
        {
-         grub_memcpy (buf, data,
-                      GRUB_DISK_CACHE_SIZE << GRUB_DISK_SECTOR_BITS);
          sector += GRUB_DISK_CACHE_SIZE;
          buf = (char *) buf + (GRUB_DISK_CACHE_SIZE << GRUB_DISK_SECTOR_BITS);
          size -= (GRUB_DISK_CACHE_SIZE << GRUB_DISK_SECTOR_BITS);
-         grub_disk_cache_unlock (disk->dev->id, disk->id,
-                                 sector + (agglomerate
-                                           << GRUB_DISK_CACHE_BITS));
        }
     }