From: Vladimir Serbinenko Date: Sat, 2 Nov 2013 20:28:03 +0000 (+0100) Subject: * grub-core/lib/reed_solomon.c (grub_reed_solomon_recover): Don't do X-Git-Tag: grub-2.02-beta1~511 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e25f8e1f372e0121d9f29107949cf323e833c832;p=thirdparty%2Fgrub.git * 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. --- diff --git a/ChangeLog b/ChangeLog index 4b3bec3df..5e75371a1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2013-11-02 Vladimir Serbinenko + + * 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 * util/grub-mount.c: Handle symlinks to directories. diff --git a/grub-core/lib/reed_solomon.c b/grub-core/lib/reed_solomon.c index aecc1e278..51b58b8e2 100644 --- a/grub-core/lib/reed_solomon.c +++ b/grub-core/lib/reed_solomon.c @@ -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)