From b05abf17cc32ed5232666ef9a47fc348bfd70030 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Wed, 30 May 2018 18:02:11 +0200 Subject: [PATCH] [poincare] Fix getPolynomialCoefficients to avoid overflowing the coefficients table --- poincare/src/addition.cpp | 4 ++-- poincare/src/multiplication.cpp | 6 +++--- poincare/src/power.cpp | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/poincare/src/addition.cpp b/poincare/src/addition.cpp index c51060e2b..b00b56680 100644 --- a/poincare/src/addition.cpp +++ b/poincare/src/addition.cpp @@ -37,7 +37,7 @@ int Addition::polynomialDegree(char symbolName) const { int Addition::getPolynomialCoefficients(char symbolName, Expression * coefficients[]) const { int deg = polynomialDegree(symbolName); - if (deg < 0 || deg > k_maxNumberOfPolynomialCoefficients-1) { + if (deg < 0 || deg > k_maxPolynomialDegree) { return -1; } for (int k = 0; k < deg+1; k++) { @@ -46,7 +46,7 @@ int Addition::getPolynomialCoefficients(char symbolName, Expression * coefficien Expression * intermediateCoefficients[k_maxNumberOfPolynomialCoefficients]; for (int i = 0; i < numberOfOperands(); i++) { int d = operand(i)->getPolynomialCoefficients(symbolName, intermediateCoefficients); - assert(d < k_maxNumberOfPolynomialCoefficients-1); + assert(d < k_maxNumberOfPolynomialCoefficients); for (int j = 0; j < d+1; j++) { static_cast(coefficients[j])->addOperand(intermediateCoefficients[j]); } diff --git a/poincare/src/multiplication.cpp b/poincare/src/multiplication.cpp index f03e06fb0..a4cb4d0c0 100644 --- a/poincare/src/multiplication.cpp +++ b/poincare/src/multiplication.cpp @@ -45,15 +45,15 @@ int Multiplication::polynomialDegree(char symbolName) const { int Multiplication::getPolynomialCoefficients(char symbolName, Expression * coefficients[]) const { int deg = polynomialDegree(symbolName); - if (deg < 0 || deg + 1 > k_maxNumberOfPolynomialCoefficients) { + if (deg < 0 || deg > k_maxPolynomialDegree) { return -1; } int degA = operand(0)->getPolynomialCoefficients(symbolName, coefficients); - assert(degA + 1 <= k_maxNumberOfPolynomialCoefficients); + assert(degA <= k_maxPolynomialDegree); Expression * intermediateCoefficients[k_maxNumberOfPolynomialCoefficients]; for (int i = 1; i < numberOfOperands(); i++) { int degB = operand(i)->getPolynomialCoefficients(symbolName, intermediateCoefficients); - assert(degB + 1 <= k_maxNumberOfPolynomialCoefficients); + assert(degB <= k_maxPolynomialDegree); for (int j = deg; j > 0; j--) { Addition * a = new Addition(); for (int l = 0; l <= j; l++) { diff --git a/poincare/src/power.cpp b/poincare/src/power.cpp index 26d7f32fb..5cc1dc7a3 100644 --- a/poincare/src/power.cpp +++ b/poincare/src/power.cpp @@ -95,7 +95,7 @@ int Power::getPolynomialCoefficients(char symbolName, Expression * coefficients[ return -1; } int n = r->numerator().extractedInt(); - if (n < k_maxNumberOfPolynomialCoefficients) { + if (n <= k_maxPolynomialDegree) { for (int i = 0; i < n; i++) { coefficients[i] = new Rational(0); }