changeset 33183:c4500208f280 stable

Check that size of "cdata" property matches in patch object (bug #65431). * libinterp/corefcn/graphics.cc (patch::properties::update_fvc): Do not continue if the number of color values in the "cdata" property doesn't match the number of faces (or vertices per face) in the patch object.
author Markus Mützel <markus.muetzel@gmx.de>
date Sat, 09 Mar 2024 19:29:51 +0100
parents 2bee38885727
children f5487b66e56e 27afeba070ed
files libinterp/corefcn/graphics.cc
diffstat 1 files changed, 23 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/graphics.cc	Fri Mar 08 19:16:53 2024 +0100
+++ b/libinterp/corefcn/graphics.cc	Sat Mar 09 19:29:51 2024 +0100
@@ -9449,21 +9449,30 @@
       return;
     }
 
+  octave_idx_type nv = xd.rows ();
+  octave_idx_type nf = xd.columns ();
+  octave_idx_type ncv = cd.rows ();
+  octave_idx_type ncf = cd.columns ();
+  if ((ncf > 1 || ncv > 1) && ((ncf != nf) || (ncv != 1 && ncv != nv)))
+    {
+      m_bad_data_msg = "cdata does not match number of faces "
+                       "or number of vertices per face";
+      return;
+    }
+
   // Faces and Vertices
   dim_vector dv;
   bool is3D = false;
-  octave_idx_type nr = xd.rows ();
-  octave_idx_type nc = xd.columns ();
-  if (nr == 1 && nc > 1)
-    {
-      nr = nc;
-      nc = 1;
+  if (nv == 1 && nf > 1)
+    {
+      nv = nf;
+      nf = 1;
       xd = xd.as_column ();
       yd = yd.as_column ();
       zd = zd.as_column ();
     }
 
-  dv(0) = nr * nc;
+  dv(0) = nv * nf;
   if (zd.isempty ())
     dv(1) = 2;
   else
@@ -9473,12 +9482,14 @@
     }
 
   Matrix vert (dv);
-  Matrix idx (nc, nr);
-
+  Matrix idx (nf, nv);
+
+  // create list of vertices from x/y/zdata
+  // FIXME: It might be possible to share vertices between adjacent faces.
   octave_idx_type kk = 0;
-  for (octave_idx_type jj = 0; jj < nc; jj++)
-    {
-      for (octave_idx_type ii = 0; ii < nr; ii++)
+  for (octave_idx_type jj = 0; jj < nf; jj++)
+    {
+      for (octave_idx_type ii = 0; ii < nv; ii++)
         {
           vert(kk, 0) = xd(ii, jj);
           vert(kk, 1) = yd(ii, jj);