changeset 32290:a81a6fb82c0e

Check for integer overflow when copying sizes from SuiteSparse matrices. * liboctave/array/CSparse.cc, dSparse.cc (fsolve), liboctave/numeric/sparse-chol.cc (sparse_chol_rep::P), liboctave/numeric/sparse-qr.cc (sparse_qr<SparseMatrix>::sparse_qr_rep::R): Use "from_size_t" instead of casting nrow and ncol from SuiteSparse matrix structures without any overflow check.
author Markus Mützel <markus.muetzel@gmx.de>
date Fri, 08 Sep 2023 15:33:36 +0200
parents a9d6f8953ef0
children 557f0edeb210
files liboctave/array/CSparse.cc liboctave/array/dSparse.cc liboctave/numeric/sparse-chol.cc liboctave/numeric/sparse-qr.cc
diffstat 4 files changed, 11 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/liboctave/array/CSparse.cc	Fri Sep 08 15:07:14 2023 +0200
+++ b/liboctave/array/CSparse.cc	Fri Sep 08 15:33:36 2023 +0200
@@ -6040,8 +6040,8 @@
               cholmod_sparse *X = CHOLMOD_NAME(spsolve) (CHOLMOD_A, L, B, cm);
 
               retval = SparseComplexMatrix
-                       (static_cast<octave_idx_type> (X->nrow),
-                        static_cast<octave_idx_type> (X->ncol),
+                       (octave::from_size_t (X->nrow),
+                        octave::from_size_t (X->ncol),
                         octave::from_suitesparse_long (CHOLMOD_NAME(nnz)
                                                        (X, cm)));
               for (octave_idx_type j = 0;
@@ -6550,8 +6550,8 @@
               cholmod_sparse *X = CHOLMOD_NAME(spsolve) (CHOLMOD_A, L, B, cm);
 
               retval = SparseComplexMatrix
-                       (static_cast<octave_idx_type> (X->nrow),
-                        static_cast<octave_idx_type> (X->ncol),
+                       (octave::from_size_t (X->nrow),
+                        octave::from_size_t (X->ncol),
                         octave::from_suitesparse_long (CHOLMOD_NAME(nnz)
                                                        (X, cm)));
               for (octave_idx_type j = 0;
--- a/liboctave/array/dSparse.cc	Fri Sep 08 15:07:14 2023 +0200
+++ b/liboctave/array/dSparse.cc	Fri Sep 08 15:33:36 2023 +0200
@@ -6054,8 +6054,8 @@
               cholmod_sparse *X = CHOLMOD_NAME(spsolve) (CHOLMOD_A, L, B, cm);
 
               retval = SparseMatrix
-                       (static_cast<octave_idx_type> (X->nrow),
-                        static_cast<octave_idx_type> (X->ncol),
+                       (octave::from_size_t (X->nrow),
+                        octave::from_size_t (X->ncol),
                         octave::from_suitesparse_long (CHOLMOD_NAME(nnz)
                                                        (X, cm)));
               for (octave_idx_type j = 0;
@@ -6549,8 +6549,8 @@
               cholmod_sparse *X = CHOLMOD_NAME(spsolve) (CHOLMOD_A, L, B, cm);
 
               retval = SparseComplexMatrix
-                       (static_cast<octave_idx_type> (X->nrow),
-                        static_cast<octave_idx_type> (X->ncol),
+                       (octave::from_size_t (X->nrow),
+                        octave::from_size_t (X->ncol),
                         octave::from_suitesparse_long (CHOLMOD_NAME(nnz)
                                                        (X, cm)));
               for (octave_idx_type j = 0;
--- a/liboctave/numeric/sparse-chol.cc	Fri Sep 08 15:07:14 2023 +0200
+++ b/liboctave/numeric/sparse-chol.cc	Fri Sep 08 15:33:36 2023 +0200
@@ -105,8 +105,7 @@
   octave_idx_type P () const
   {
 #if defined (HAVE_CHOLMOD)
-    return (m_minor_p == static_cast<octave_idx_type> (m_L->ncol) ?
-            0 : m_minor_p + 1);
+    return (m_minor_p == from_size_t (m_L->ncol) ? 0 : m_minor_p + 1);
 #else
     return 0;
 #endif
--- a/liboctave/numeric/sparse-qr.cc	Fri Sep 08 15:07:14 2023 +0200
+++ b/liboctave/numeric/sparse-qr.cc	Fri Sep 08 15:33:36 2023 +0200
@@ -634,8 +634,8 @@
 {
 #if (defined (HAVE_SPQR) && defined (HAVE_CHOLMOD))
 
-  octave_idx_type nr = static_cast<octave_idx_type> (m_R->nrow);
-  octave_idx_type nc = static_cast<octave_idx_type> (m_R->ncol);
+  octave_idx_type nr = from_size_t (m_R->nrow);
+  octave_idx_type nc = from_size_t (m_R->ncol);
   octave_idx_type nz
     = from_suitesparse_long
       (cholmod_l_nnz (m_R, const_cast<cholmod_common *> (&m_cc)));