diff --git a/grub-core/lib/reed_solomon.c b/grub-core/lib/reed_solomon.c index 3d8bb9e1f..0257342d0 100644 --- a/grub-core/lib/reed_solomon.c +++ b/grub-core/lib/reed_solomon.c @@ -25,6 +25,10 @@ #define grub_memcpy memcpy #endif +#ifndef STANDALONE +#include +#endif + #ifndef STANDALONE #ifdef TEST typedef unsigned int grub_size_t; @@ -456,6 +460,10 @@ grub_reed_solomon_add_redundancy (void *buffer, grub_size_t data_size, grub_size_t rs = redundancy; gf_single_t *ptr = buffer; gf_single_t *rptr = ptr + s; + void *tmp; + + tmp = xmalloc (data_size); + grub_memcpy (tmp, buffer, data_size); /* Nothing to do. */ if (!rs) @@ -481,6 +489,9 @@ grub_reed_solomon_add_redundancy (void *buffer, grub_size_t data_size, s -= cs; rs -= crs; } + + assert (grub_memcmp (tmp, buffer, data_size) == 0); + free (tmp); } #endif diff --git a/util/grub-setup.c b/util/grub-setup.c index d3b3b7520..8965143c5 100644 --- a/util/grub-setup.c +++ b/util/grub-setup.c @@ -448,10 +448,14 @@ setup (const char *dir, + GRUB_KERNEL_I386_PC_REED_SOLOMON_REDUNDANCY) = grub_host_to_target32 (nsec * GRUB_DISK_SECTOR_SIZE - core_size); + void *tmp = xmalloc (core_size); + grub_memcpy (tmp, core_img, core_size); grub_reed_solomon_add_redundancy (core_img + GRUB_KERNEL_I386_PC_NO_REED_SOLOMON_PART + GRUB_DISK_SECTOR_SIZE, core_size - GRUB_KERNEL_I386_PC_NO_REED_SOLOMON_PART - GRUB_DISK_SECTOR_SIZE, nsec * GRUB_DISK_SECTOR_SIZE - core_size); + assert (grub_memcmp (tmp, core_img, core_size) == 0); + free (tmp); /* Make sure that the second blocklist is a terminator. */ block = first_block - 1;