]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* grub-core/lib/reed_solomon.c (grub_reed_solomon_recover): Don't do
authorVladimir Serbinenko <phcoder@gmail.com>
Sat, 2 Nov 2013 20:28:03 +0000 (21:28 +0100)
committerVladimir Serbinenko <phcoder@gmail.com>
Sat, 2 Nov 2013 20:28:03 +0000 (21:28 +0100)
Reed-Solomon recovery if more than half of redundancy info is 0.

ChangeLog
grub-core/lib/reed_solomon.c

index 4b3bec3df264ea207ceccb9388e45bae46c28b4c..5e75371a16703b921a6fed4230499f13f74706fe 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2013-11-02  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * grub-core/lib/reed_solomon.c (grub_reed_solomon_recover): Don't do
+       Reed-Solomon recovery if more than half of redundancy info is 0.
+
 2013-11-02  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * util/grub-mount.c: Handle symlinks to directories.
index aecc1e278c27504252cb981968649836bf854cfe..51b58b8e25a53c7858c3ff7cc06b7d57fe925e72 100644 (file)
@@ -382,11 +382,18 @@ 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;
+  grub_uint8_t *cptr;
 
   /* Nothing to do.  */
   if (!rs)
     return;
 
+  for (cptr = rptr + rs - 1; cptr >= rptr; cptr--)
+    if (*cptr)
+      break;
+  if (rptr + rs - 1 - cptr > (grub_ssize_t) rs / 2)
+    return;
+
   init_powx ();
 
   while (s > 0)