Mercurial > jwe > octave
changeset 25052:576ff914979c stable
__expint__.cc: Fix heap-buffer-overflow (bug #53514).
* __expint__.cc: Move initialization of variables for Lentz's algorithm within
the body of the for loop so that if the loop is never executed, say for an
empty matrix, there is no attempt to access the first value of x.
author | Rik <rik@octave.org> |
---|---|
date | Thu, 29 Mar 2018 11:55:04 -0700 |
parents | 7c499f1426e5 |
children | ef8c6852a53d |
files | libinterp/corefcn/__expint__.cc |
diffstat | 1 files changed, 22 insertions(+), 38 deletions(-) [+] |
line wrap: on
line diff
--- a/libinterp/corefcn/__expint__.cc Thu Mar 29 20:30:32 2018 +0200 +++ b/libinterp/corefcn/__expint__.cc Thu Mar 29 11:55:04 2018 -0700 @@ -63,17 +63,9 @@ // Initialize variables used in algorithm static const FloatComplex tiny = pow (2, -50); static const float eps = std::numeric_limits<float>::epsilon (); - FloatComplex cone (1.0, 0.0); - FloatComplex czero (0.0, 0.0); - FloatComplex xj = x(0); - FloatComplex y = tiny; - FloatComplex Cj = y; - FloatComplex Dj = czero; - FloatComplex alpha_j = cone; - FloatComplex beta_j = czero; - FloatComplex Deltaj = czero; - int j = 1; - int maxit = 100; + const FloatComplex cone (1.0, 0.0); + const FloatComplex czero (0.0, 0.0); + const int maxit = 100; // Loop over all elements for (octave_idx_type i = 0; i < numel_x; ++i) @@ -82,14 +74,14 @@ OCTAVE_QUIT; // Variable initialization for the current element - xj = x(i); - y = tiny; - Cj = y; - Dj = czero; - alpha_j = cone; - beta_j = xj; - Deltaj = czero; - j = 1; + FloatComplex xj = x(i); + FloatComplex y = tiny; + FloatComplex Cj = y; + FloatComplex Dj = czero; + FloatComplex alpha_j = cone; + FloatComplex beta_j = xj; + FloatComplex Deltaj = czero; + int j = 1; // Lentz's algorithm while ((std::abs (Deltaj - cone) > eps) && (j < maxit)) @@ -129,17 +121,9 @@ // Initialize variables used in algorithm static const Complex tiny = pow (2, -100); static const double eps = std::numeric_limits<double>::epsilon (); - Complex cone (1.0, 0.0); - Complex czero (0.0, 0.0); - Complex xj = x(0); - Complex y = tiny; - Complex Cj = y; - Complex Dj = czero; - Complex alpha_j = cone; - Complex beta_j = xj; - Complex Deltaj = czero; - int j = 1; - int maxit = 200; + const Complex cone (1.0, 0.0); + const Complex czero (0.0, 0.0); + const int maxit = 200; // Loop over all scenarios for (octave_idx_type i = 0; i < numel_x; ++i) @@ -148,14 +132,14 @@ OCTAVE_QUIT; // Variable initialization for the current element - xj = x(i); - y = tiny; - Cj = y; - Dj = czero; - alpha_j = cone; - beta_j = xj; - Deltaj = czero; - j = 1; + Complex xj = x(i); + Complex y = tiny; + Complex Cj = y; + Complex Dj = czero; + Complex alpha_j = cone; + Complex beta_j = xj; + Complex Deltaj = czero; + int j = 1; // Lentz's algorithm while ((std::abs (Deltaj - cone) > eps) && (j < maxit))