]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* grub-core/lib/disk.c: Fix potential overflow.
authorVladimir Serbinenko <phcoder@gmail.com>
Sat, 21 Dec 2013 12:32:39 +0000 (13:32 +0100)
committerVladimir Serbinenko <phcoder@gmail.com>
Sat, 21 Dec 2013 12:32:39 +0000 (13:32 +0100)
ChangeLog
grub-core/lib/disk.c

index d3eca7490d465c1af7d2e164f47a479b173e00e7..a1ebfd7db8cac566732282a49906e4ca579cfa88 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2013-12-21  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * grub-core/lib/disk.c: Fix potential overflow.
+
 2013-12-21  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * grub-core/lib/arg.c: Don't discard const attribute.
index c7ba68007a87434a81e43e776e74cfe39cdc5fae..0f186883afeb2427d4863c6ba36ab7e44e142810 100644 (file)
@@ -37,7 +37,7 @@ grub_disk_cache_invalidate (unsigned long dev_id, unsigned long disk_id,
   unsigned cache_index;
   struct grub_disk_cache *cache;
 
-  sector &= ~(GRUB_DISK_CACHE_SIZE - 1);
+  sector &= ~((grub_disk_addr_t) GRUB_DISK_CACHE_SIZE - 1);
   cache_index = grub_disk_cache_get_index (dev_id, disk_id, sector);
   cache = grub_disk_cache_table + cache_index;
 
@@ -63,8 +63,8 @@ grub_disk_write (grub_disk_t disk, grub_disk_addr_t sector,
   if (grub_disk_adjust_range (disk, &sector, &offset, size) != GRUB_ERR_NONE)
     return -1;
 
-  aligned_sector = (sector & ~((1 << (disk->log_sector_size
-                                     - GRUB_DISK_SECTOR_BITS)) - 1));
+  aligned_sector = (sector & ~((1ULL << (disk->log_sector_size
+                                        - GRUB_DISK_SECTOR_BITS)) - 1));
   real_offset = offset + ((sector - aligned_sector) << GRUB_DISK_SECTOR_BITS);
   sector = aligned_sector;
 
@@ -77,14 +77,14 @@ grub_disk_write (grub_disk_t disk, grub_disk_addr_t sector,
          grub_size_t len;
          grub_partition_t part;
 
-         tmp_buf = grub_malloc (1 << disk->log_sector_size);
+         tmp_buf = grub_malloc (1U << disk->log_sector_size);
          if (!tmp_buf)
            return grub_errno;
 
          part = disk->partition;
          disk->partition = 0;
          if (grub_disk_read (disk, sector,
-                             0, (1 << disk->log_sector_size), tmp_buf)
+                             0, (1U << disk->log_sector_size), tmp_buf)
              != GRUB_ERR_NONE)
            {
              disk->partition = part;
@@ -93,7 +93,7 @@ grub_disk_write (grub_disk_t disk, grub_disk_addr_t sector,
            }
          disk->partition = part;
 
-         len = (1 << disk->log_sector_size) - real_offset;
+         len = (1U << disk->log_sector_size) - real_offset;
          if (len > size)
            len = size;
 
@@ -110,7 +110,7 @@ grub_disk_write (grub_disk_t disk, grub_disk_addr_t sector,
 
          grub_free (tmp_buf);
 
-         sector += (1 << (disk->log_sector_size - GRUB_DISK_SECTOR_BITS));
+         sector += (1U << (disk->log_sector_size - GRUB_DISK_SECTOR_BITS));
          buf = (const char *) buf + len;
          size -= len;
          real_offset = 0;
@@ -120,7 +120,7 @@ grub_disk_write (grub_disk_t disk, grub_disk_addr_t sector,
          grub_size_t len;
          grub_size_t n;
 
-         len = size & ~((1 << disk->log_sector_size) - 1);
+         len = size & ~((1ULL << disk->log_sector_size) - 1);
          n = size >> disk->log_sector_size;
 
          if (n > (disk->max_agglomerate
@@ -137,7 +137,7 @@ grub_disk_write (grub_disk_t disk, grub_disk_addr_t sector,
          while (n--)
            {
              grub_disk_cache_invalidate (disk->dev->id, disk->id, sector);
-             sector += (1 << (disk->log_sector_size - GRUB_DISK_SECTOR_BITS));
+             sector += (1U << (disk->log_sector_size - GRUB_DISK_SECTOR_BITS));
            }
 
          buf = (const char *) buf + len;