]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Avoid using Reed-Solomon with 0 redundancy.
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Mon, 27 Dec 2010 06:09:43 +0000 (07:09 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Mon, 27 Dec 2010 06:09:43 +0000 (07:09 +0100)
* grub-core/kern/i386/pc/startup.S: Remove 0-data check.
* grub-core/lib/reed_solomon.c (decode_block): Do not proceed on 0 data
or 0 redundancy.
(grub_reed_solomon_add_redundancy): Do not proceed with 0 redundancy.
(grub_reed_solomon_recover): Likewise.

ChangeLog
grub-core/kern/i386/pc/startup.S
grub-core/lib/reed_solomon.c

index 0e4a725a59a9ebc441c1e2209a10e5609d046c68..d7606da2a415a194b55cdcdf4adf563875a50017 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2010-12-27  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       Avoid using Reed-Solomon with 0 redundancy.
+
+       * grub-core/kern/i386/pc/startup.S: Remove 0-data check.
+       * grub-core/lib/reed_solomon.c (decode_block): Do not proceed on 0 data
+       or 0 redundancy.
+       (grub_reed_solomon_add_redundancy): Do not proceed with 0 redundancy.
+       (grub_reed_solomon_recover): Likewise.
+
 2010-12-27  Vladimir Serbinenko  <phcoder@gmail.com>
 
        Don't use disk subsystem in freebsd_boot.
index 7aebc8b3874c9220873c157e19b7faa3fba2fae4..e78a0aa9aacb5a7cb429c66ce2e7b4811275b480 100644 (file)
@@ -151,8 +151,6 @@ LOCAL (codestart):
        addl    $(GRUB_KERNEL_MACHINE_RAW_SIZE - GRUB_KERNEL_I386_PC_NO_REED_SOLOMON_PART), %edx
        movl    reed_solomon_redundancy, %ecx
        leal    _start + GRUB_KERNEL_I386_PC_NO_REED_SOLOMON_PART, %eax
-       testl   %edx, %edx
-       jz post_reed_solomon
        call    EXT_C (grub_reed_solomon_recover)
        jmp post_reed_solomon
 
index 6f571550a2a5a1923e422e4c8beb16ee2f97e985..9a40e2f98b26ec46a68fa2dad5ab9261017cfef1 100644 (file)
@@ -372,6 +372,10 @@ decode_block (gf_single_t *ptr, grub_size_t s,
       grub_size_t rr = (rs + SECTOR_SIZE - 1 - i) / SECTOR_SIZE;
       gf_single_t m[ds + rr];
 
+      /* Nothing to do.  */
+      if (!ds || !rr)
+       continue;
+
       for (j = 0; j < (int) ds; j++)
        m[j] = ptr[SECTOR_SIZE * j + i];
       for (j = 0; j < (int) rr; j++)
@@ -414,6 +418,10 @@ grub_reed_solomon_add_redundancy (void *buffer, grub_size_t data_size,
   gf_single_t *ptr = buffer;
   gf_single_t *rptr = ptr + s;
 
+  /* Nothing to do.  */
+  if (!rs)
+    return;
+
   while (s > 0)
     {
       grub_size_t tt;
@@ -441,6 +449,10 @@ grub_reed_solomon_recover (void *ptr_, grub_size_t s, grub_size_t rs)
   gf_single_t *ptr = ptr_;
   gf_single_t *rptr = ptr + s;
 
+  /* Nothing to do.  */
+  if (!rs)
+    return;
+
 #if defined (STANDALONE)
   init_inverts ();
 #endif
@@ -454,8 +466,8 @@ grub_reed_solomon_recover (void *ptr_, grub_size_t s, grub_size_t rs)
       tt = cs + crs;
       if (tt > MAX_BLOCK_SIZE)
        {
-         cs = cs * MAX_BLOCK_SIZE / tt;
-         crs = crs * MAX_BLOCK_SIZE / tt;
+         cs = (cs * MAX_BLOCK_SIZE) / tt;
+         crs = (crs * MAX_BLOCK_SIZE) / tt;
        }
       decode_block (ptr, cs, rptr, crs);
       ptr += cs;