Don't initialise roots beyond end of field

AKA don't use code from draft standards without testing it!
Bug reported by Christian Sakowski
This commit is contained in:
Robin Stuart 2017-01-22 19:12:11 +00:00
parent c0f6139f86
commit ecb10e6b7d

View File

@ -184,7 +184,7 @@ void rsencode(int nd, int nc, unsigned char *wd) {
// Start by generating "nc" roots (antilogs): // Start by generating "nc" roots (antilogs):
root[0] = 1; root[0] = 1;
for (i = 1; i <= nc; i++) for (i = 1; (i <= nc) && (i < GF); i++)
root[i] = (PM * root[i - 1]) % GF; root[i] = (PM * root[i - 1]) % GF;
// Here we compute how many interleaved R-S blocks will be needed // Here we compute how many interleaved R-S blocks will be needed
@ -1121,13 +1121,6 @@ int dotcode(struct zint_symbol *symbol, const unsigned char source[], int length
data_length++; data_length++;
} }
if (data_length > 450) {
// Larger data sets than this cause rsencode() to throw SIGSEGV
// This should probably be fixed by somebody who understands what rsencode() does...
strcpy(symbol->errtxt, "Input too long (E21)");
return ZINT_ERROR_TOO_LONG;
}
ecc_length = 3 + (data_length / 2); ecc_length = 3 + (data_length / 2);
/* Evaluate data mask options */ /* Evaluate data mask options */