diff --git a/ChangeLog b/ChangeLog index 9339da619..48b373e03 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2013-10-20 Vladimir Serbinenko + + * grub-core/kern/disk.c (grub_disk_write): Use malloc/free instead of + variable length arrays. + + Saves 50 bytes on compressed image. + 2013-10-20 Vladimir Serbinenko * grub-core/loader/i386/bsd.c: Remove variable length arrays. diff --git a/grub-core/kern/disk.c b/grub-core/kern/disk.c index b58158eeb..b0b271512 100644 --- a/grub-core/kern/disk.c +++ b/grub-core/kern/disk.c @@ -635,10 +635,14 @@ grub_disk_write (grub_disk_t disk, grub_disk_addr_t sector, if (real_offset != 0 || (size < (1U << disk->log_sector_size) && size != 0)) { - char tmp_buf[1 << disk->log_sector_size]; + char *tmp_buf; grub_size_t len; grub_partition_t part; + tmp_buf = grub_malloc (1 << disk->log_sector_size); + if (!tmp_buf) + return grub_errno; + part = disk->partition; disk->partition = 0; if (grub_disk_read (disk, sector, @@ -646,6 +650,7 @@ grub_disk_write (grub_disk_t disk, grub_disk_addr_t sector, != GRUB_ERR_NONE) { disk->partition = part; + grub_free (tmp_buf); goto finish; } disk->partition = part; @@ -660,7 +665,12 @@ grub_disk_write (grub_disk_t disk, grub_disk_addr_t sector, if ((disk->dev->write) (disk, transform_sector (disk, sector), 1, tmp_buf) != GRUB_ERR_NONE) - goto finish; + { + grub_free (tmp_buf); + goto finish; + } + + grub_free (tmp_buf); sector += (1 << (disk->log_sector_size - GRUB_DISK_SECTOR_BITS)); buf = (const char *) buf + len;