| From dd70636db6268053602788245af437244ac540e1 Mon Sep 17 00:00:00 2001 |
| From: Ferdinand Blomqvist <ferdinand.blomqvist@gmail.com> |
| Date: Thu, 20 Jun 2019 17:10:34 +0300 |
| Subject: rslib: Fix decoding of shortened codes |
| |
| [ Upstream commit 2034a42d1747fc1e1eeef2c6f1789c4d0762cb9c ] |
| |
| The decoding of shortenend codes is broken. It only works as expected if |
| there are no erasures. |
| |
| When decoding with erasures, Lambda (the error and erasure locator |
| polynomial) is initialized from the given erasure positions. The pad |
| parameter is not accounted for by the initialisation code, and hence |
| Lambda is initialized from incorrect erasure positions. |
| |
| The fix is to adjust the erasure positions by the supplied pad. |
| |
| Signed-off-by: Ferdinand Blomqvist <ferdinand.blomqvist@gmail.com> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Link: https://lkml.kernel.org/r/20190620141039.9874-3-ferdinand.blomqvist@gmail.com |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| lib/reed_solomon/decode_rs.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/lib/reed_solomon/decode_rs.c b/lib/reed_solomon/decode_rs.c |
| index 1db74eb098d0..3313bf944ff1 100644 |
| --- a/lib/reed_solomon/decode_rs.c |
| +++ b/lib/reed_solomon/decode_rs.c |
| @@ -99,9 +99,9 @@ |
| if (no_eras > 0) { |
| /* Init lambda to be the erasure locator polynomial */ |
| lambda[1] = alpha_to[rs_modnn(rs, |
| - prim * (nn - 1 - eras_pos[0]))]; |
| + prim * (nn - 1 - (eras_pos[0] + pad)))]; |
| for (i = 1; i < no_eras; i++) { |
| - u = rs_modnn(rs, prim * (nn - 1 - eras_pos[i])); |
| + u = rs_modnn(rs, prim * (nn - 1 - (eras_pos[i] + pad))); |
| for (j = i + 1; j > 0; j--) { |
| tmp = index_of[lambda[j - 1]]; |
| if (tmp != nn) { |
| -- |
| 2.20.1 |
| |